From nobody Mon Dec 1 22:07:30 2025 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022136.outbound.protection.outlook.com [52.101.126.136]) (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 5E10F2798F8; Sun, 30 Nov 2025 10:43:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.136 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499407; cv=fail; b=JUprYtVIRrwWZMYr56veQEg3SMWEO7Pg4UDiZnOCIvDXbvbpA6b8bqDTV8F1zNZ//JxQ5zSeOqIRF7E5EdjaTavj57AlDGbVYT7hvR8kLkPq0iHX6Ttylt2Aywp2djH2F8LhSFXyjyYNXd4V/SFqcAqgCRG7MjFaely3BrbwxM8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499407; c=relaxed/simple; bh=XBfl+wRjcnRlwDFIzFapvAyCIUeHkdr5XE0Mfi4r2tM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=bi+MBAb2KEEemAc4Sh22wgaIC2r9OFiOoFSffN7adHNFNj0mSw5UiDHKDCBVb6gGVrsNj9sriEI+DEWJWZ9f8OZ1Pj7NhISLFB8kKrfWGr7tM93Ymru71NuW0rdh2ACFPBPU3R5ayrDipguyl6taPbpztNpFZHY5P3mAscz/4M8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=F558SBrp; arc=fail smtp.client-ip=52.101.126.136 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="F558SBrp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=J7DKe6mmb7Cus1kmgFsN2LKMtdbd+1S2JHei4MUgKh3Tx8dh9VsJHrDARvAMynTdvbjC9mUQa6DfsQYbHEZzWguMnHnZDpDOIuu69F2sEDnqggueNet//aLv0G4hvn0dYZFfZmSCXJ8pl9bNZxxgodoFE0LkF7OchrV+hgBo8ln8B01HeQdWfrfyQGdKAThh7MS3b32CM9snrlJQhf2ca58uVhomxGHLyMmEtJgHIVHJKYTtd0DTUnXlDRDPRm1Ybv1XMHRVWIAkfbQjma1ayPNXHVR+pJ+AM4oLh2JXruJTSy2B315DebTdF41sag/assVBmX18UiKhN3FXhOoUOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=m8nTVMo0EuIdKPVvyKmjiWVY4HZwpuePIulTqGEwabo=; b=rDUOyURcBobJaXZHI21SmV59cVFSjw7Qnjitl49HhiqZMvVja7abNIBXZFhXS1q9hfPlfG3D579NM38j1jttqSbeyTKdT9KfjWJk5CwwUOP0oTXUiOCD5BJ6iOkBxpCzrI/8r4lutEMWT+LUoYjr5ZwcB4nPOsTeiNyvyLBzpOGl/jA3gHiJVNNZD7NiXiLltIkdTRDwz8E2GnDqCgJjG8Sb2HlYpOSizgerVTJUeaNBEgOn+hQJjvGJMC/Yce6aB3/VBCdhgNCDMGZEFlo34TrXMAvkJtDFB74LHcVjl363B6Zbp3fic0D4Q1Wn01yEBLWEFsHC4T1kBUbEefkdbw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=m8nTVMo0EuIdKPVvyKmjiWVY4HZwpuePIulTqGEwabo=; b=F558SBrpOyl3i/brfHEInV2G2V/huHDx+XHZDn1+kYhfcMVP7xtf8/ycpP4ZDZd0YfE7fcs3XlSeBcLqHvu0Pgpec8HNh7MRh9fv9fmMrJ/SNc1xfzBRfOkoWVhcoF4ylDfOKHcOrmJxJiEfpNAeU9zqK7AyBLAEV9sNUAuLv5U= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:43:18 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:43:18 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 01/31] tty: mxser: serial: 8250: replace mxser with 8250-based driver Date: Sun, 30 Nov 2025 18:41:52 +0800 Message-ID: <20251130104222.63077-2-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 0d19d256-d7b7-4d61-020c-08de2ffd4633 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ab+h3063b/8qakTI3jeUX9+qCI07tUj0bqWcOrsmqfvex5mQNrdDnWoqzjOw?= =?us-ascii?Q?Sg7Zgo1qn0NSvcSRLR5ywQOcguzgUNHcs7JTCL5KTP4jPWfJE6ibJd5sDt7C?= =?us-ascii?Q?/NfZnNOZPAkYF9oTnnnzG+eSWNFROGG265nH6kKJEXYze+D6xQpsJiLrOPo7?= =?us-ascii?Q?yiRRt3Y9fZR/Q0dLr47C/UgQxRAQFFrOcgTCPtYQx56hRdrmB73TkUCZhi7r?= =?us-ascii?Q?R+KNq1047X5NMFk64XCz3x9Lv2Uywm2dTkFGNC5IpYHf7WPgqUdp7VUeeC7A?= =?us-ascii?Q?GNBaxCBYC4SqvvKVBmroEnnbFPIjOfbZs4oVsCvlIwhosb/h6uj4wlzfUidG?= =?us-ascii?Q?LT6wi1JcfDn0Bo/S4YkBUurfCX0QaRJJc4lID8lJeSCWnnb3zBVG5V/gF/l/?= =?us-ascii?Q?6oo5oIEA7g0CULiUu2HvRF59F53bAAYRvWFct6KnfT85bdjLfnryGrwUMrfd?= =?us-ascii?Q?fgQvS5TcCjN8fpEEbB6muBbeU3NViUN/7KQplowe7E+SF+Exl8WBHgPuSjca?= =?us-ascii?Q?5Vlz3XvFQoqJkrNlXA9ZpgYWTPStOwuH1oDrx+WW+H5rL2FmvDS4NuFVuxt4?= =?us-ascii?Q?x113Co8A6VLGtfSPZeV7ZoWufQvbE1zgKCpdv3z8exL4l+FDZ4WFgDVzK4cI?= =?us-ascii?Q?kzOK27rINXBGmclJmVLMX2LEERIBoX5Mz/84+dcF3r4d4htowSpAfZgK4lxu?= =?us-ascii?Q?78MWPLZaOiEIzXxSg75G2OPz9y1o1Qo+al0GFv3283nVQTP0+x5hlaexqgnj?= =?us-ascii?Q?Uuk/0EPBYP7jyrcDEYe18tXp41svt5bWUMmFXp7ZypENxvanZzE8qWqi6qBF?= =?us-ascii?Q?XC8ahDvrDfL1fXkbQW5EsqHGgNK7sMDqfkvi3HPaEdae5pPXD3IlTd5tBcqG?= =?us-ascii?Q?AFzd9Y9daW6On7D5xQuwILU9pjFcXhiLj+540GD5TqNwsYP7BYh5cuJ1pmZa?= =?us-ascii?Q?Xj0jfaqtHFQdKgXwzrsiDTD1m+O27iA8DlcNH1nphnsfCY3IFkBNmIgkol8v?= =?us-ascii?Q?Fw2I67ZYirvYyFbrnMdO8/xRZqSH7nYICRYg/bl8qxmmLF6vJivcGqn1ew+g?= =?us-ascii?Q?UJt+m9+IVIP/2uUQ3/+ReoSHTfAq1tyYp0VtiPWGkiS9lSJxtCDwYyd/CQTw?= =?us-ascii?Q?zuwGUCYH6TWqxWeNJ7BO3eUjKqJmnYe6IpfcCDYqLbd9fqQq6FygF6A8rX/Y?= =?us-ascii?Q?akA7XkbM6iRWklY43jUV9SeLAEReXtsRmIYqU9p3De8knMZBpOqzXBrP09wi?= =?us-ascii?Q?sYpTnoH2t0kN8HAz7gmqPtHO20vMNc3B78pUfL+tFac2VLYTAThwScX8JL7T?= =?us-ascii?Q?liecMGMtZCBOyWVAdMexMZWUEX/EiZJUyWxJd9n6sL7xj1BnN2LVZxJFmwIp?= =?us-ascii?Q?pgypts259P7qIhSEs06Qfehnp3pfXIIDvj31wMPhAf/AYuSdCLndRvpoV1Bu?= =?us-ascii?Q?DZMb61h/SFpVCJgKwVF4AtRHvveBZ9n3WO6t2xSnI0kdxzb9IrjvHRJHSlJ4?= =?us-ascii?Q?8+MKfPVHrs/zEExrMVl2DS8ClAA+98O39uUJ?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?swPZBROKxMgyyfrUZAkLPADJXWBjBP9q8jHdLjv9ycnnueqpnAsHKIhYZR/H?= =?us-ascii?Q?SuwYzrwGISvrFMQ1kV+V5qVeBWrQVfQVwZbWbzBXzbmTROPJat2PLl3uwU1R?= =?us-ascii?Q?epfhH+1wO9DjLoNMbktRo63Vq7bAdSH31uKGGxrq/8ZoHpWzNj/3U4cXwymI?= =?us-ascii?Q?ArGPkJFkojrQDMRBDiVqR9bC538tfWmjAu7YUif8ZLZbUziKzq+L0/FSAlTk?= =?us-ascii?Q?QQArXni1USGBgdzFoZu6L/zeyT4c/i91jAgySw6fN1Fh/BZC+0VetxdgTqLj?= =?us-ascii?Q?A6Ruu8s7aBG/GR6ZzJTqKbZgzMzxE7vtyXRsiSBtRfADdgrr84lCy/6xGx5n?= =?us-ascii?Q?7PPICA9ffi3WDLXiv5madz861W3kH+VlowL3Y+NfdLYadK0aATC7FToy6mB4?= =?us-ascii?Q?8qk0bRo+uvjyisODq4LH5PJsx5Il/NFN5jGpeeI4HwVkYMcslWGh24289mCj?= =?us-ascii?Q?kz0rpn6U68e5GbJP51mu3Dj7scIJ2ztWO0mYZJf188BxdjsEpFoXHTSJDEDX?= =?us-ascii?Q?PYIvZ741GL8s5+G4zR4dTMtagWFm2grvSExPPk8aXGl4vLiSy47xAT/L2oXi?= =?us-ascii?Q?6rtAuqNMZskxzVcGOZ+TqREzC+GdVHxrSZpT9xjKu3am90qQOCuUzs3n+YIm?= =?us-ascii?Q?kvJpRvbh+tybcd0kOJBYVou012LoxxuvN9olzAsfgNRWgKeZxpZ/uAjknrM/?= =?us-ascii?Q?34eYfdMaTK4rpw56zCOVDSU9n1rBceCfojNdC31wJ7jwTCsFbjuYnwlymMTR?= =?us-ascii?Q?2aeQwC9S0VHyOIMbLWnko1srWxpLgnrMoKD7Bf5OYm3y4eIFq/wQKmsh/XwQ?= =?us-ascii?Q?g3kzXnYA7dpYgaMTEgxxyyRPoGtHN3r9Sq7n8O/vtWVMoCdgMLmCMeYOgGZ5?= =?us-ascii?Q?4UAkxhYsHOo7oFFHt/xLWLaS/+6zHZ3iR6E8LFmxlOUEPMf+Q/upIY3Ujs6D?= =?us-ascii?Q?Xgoys38jsPb484uytvDkXmXr3x0hcSX+Rd8kTToUFKe4kTkGhTWDkTxGn5jb?= =?us-ascii?Q?p+EMv+/BM+v7xQSGtPWhVlbxTVadePcYS4Ihqz/1Frq225FEnX8m4M2kXYVp?= =?us-ascii?Q?1cnI4nd8SfRm0/AqnRPtmA+pXOs8wl0m9iJ8CTRCO4hzd9/XtBN71QadMmyR?= =?us-ascii?Q?+aIuMvltCAAZsXgPLKhu4fa2jYE6JQHNR1jt04KNXWz+N6HV1Pd/Og+dj5Jr?= =?us-ascii?Q?8M7U1/f35LS9TXkKJbVZ5/HtSd6a4Y9WCkjtqEyrl/4FfjV4Xo81AYCgER2Q?= =?us-ascii?Q?/w5ZOU3VLEVw+DEPXvsYHselLU04SlsL3MqCCrpZkeA0YMWAXABC51HlRDoA?= =?us-ascii?Q?yGrdwdZ4MWFnujR+7orAXqBr5WTEkKwqk5AtRzrwUUyd23qQwXaurE7LLZWC?= =?us-ascii?Q?FCHH/k6gdHwefVkpuM1lUtksBjYzsVyAgsQDm4tNttNdQ7nvKjzJ7pSensh9?= =?us-ascii?Q?ome/69hom4FPwSCC6yNsQE7hfntBpxBvYgxXgtSBtX9b+QMSDzh1QBrzDI90?= =?us-ascii?Q?pFJGJnrBRM0oHmp3De9/Pky6HOV4X6xYGMLGsa2NVJUK6wlFaTv/o6WPXKE1?= =?us-ascii?Q?dOWyfF3DF8wzM8zC0YffZsbf0sROn9SwXvEdkT1OcE3kg32c+QpA2FdZaRWJ?= =?us-ascii?Q?AA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0d19d256-d7b7-4d61-020c-08de2ffd4633 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:43:18.6090 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: XupNBqOuV+ufpNdJm3ozxo9/pFbV2MxMQDhF2hJO/R9/NwucbRJYQok4GaTFVb+CrMaj7zQYArxSryNeEjZv2GSyjQaFK3St7/G3Hrt7aJ0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Remove the legacy mxser driver and replace it with 8250-based implementation (8250_mxupci) for Moxa UPCI serial devices. This simplifies maintenance and improves integration with the existing 8250 serial infrastructure. Signed-off-by: Crescent Hsieh --- drivers/tty/Kconfig | 13 - drivers/tty/Makefile | 1 - drivers/tty/mxser.c | 1934 ------------------------- drivers/tty/serial/8250/8250_mxupci.c | 165 +++ drivers/tty/serial/8250/Kconfig | 11 + drivers/tty/serial/8250/Makefile | 1 + 6 files changed, 177 insertions(+), 1948 deletions(-) delete mode 100644 drivers/tty/mxser.c create mode 100644 drivers/tty/serial/8250/8250_mxupci.c diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig index 63a494d36a1f..3973b52bcfce 100644 --- a/drivers/tty/Kconfig +++ b/drivers/tty/Kconfig @@ -218,19 +218,6 @@ config MOXA_INTELLIO To compile this driver as a module, choose M here: the module will be called moxa. =20 -config MOXA_SMARTIO - tristate "Moxa SmartIO support v. 2.0" - depends on SERIAL_NONSTANDARD && PCI && HAS_IOPORT - help - Say Y here if you have a Moxa SmartIO multiport serial card and/or - want to help develop a new version of this driver. - - This is upgraded (1.9.1) driver from original Moxa drivers with - changes finally resulting in PCI probing. - - This driver can also be built as a module. The module will be called - mxser. If you want to do that, say M here. - config SYNCLINK_GT tristate "SyncLink GT/AC support" depends on SERIAL_NONSTANDARD && PCI diff --git a/drivers/tty/Makefile b/drivers/tty/Makefile index 07aca5184a55..7db70532e8da 100644 --- a/drivers/tty/Makefile +++ b/drivers/tty/Makefile @@ -18,7 +18,6 @@ obj-$(CONFIG_SERIAL_DEV_BUS) +=3D serdev/ # tty drivers obj-$(CONFIG_AMIGA_BUILTIN_SERIAL) +=3D amiserial.o obj-$(CONFIG_MOXA_INTELLIO) +=3D moxa.o -obj-$(CONFIG_MOXA_SMARTIO) +=3D mxser.o obj-$(CONFIG_NOZOMI) +=3D nozomi.o obj-$(CONFIG_NULL_TTY) +=3D ttynull.o obj-$(CONFIG_SYNCLINK_GT) +=3D synclink_gt.o diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c deleted file mode 100644 index 4d45eca4929a..000000000000 --- a/drivers/tty/mxser.c +++ /dev/null @@ -1,1934 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * mxser.c -- MOXA Smartio/Industio family multiport serial driv= er. - * - * Copyright (C) 1999-2006 Moxa Technologies (support@moxa.com). - * Copyright (C) 2006-2008 Jiri Slaby - * - * This code is loosely based on the 1.8 moxa driver which is based on - * Linux serial driver, written by Linus Torvalds, Theodore T'so and - * others. - * - * Fed through a cleanup, indent and remove of non 2.6 code by Alan Cox - * . The original 1.8 code is available on - * www.moxa.com. - * - Fixed x86_64 cleanness - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/* - * Semi-public control interfaces - */ - -/* - * MOXA ioctls - */ - -#define MOXA 0x400 -#define MOXA_SET_OP_MODE (MOXA + 66) -#define MOXA_GET_OP_MODE (MOXA + 67) - -#define RS232_MODE 0 -#define RS485_2WIRE_MODE 1 -#define RS422_MODE 2 -#define RS485_4WIRE_MODE 3 -#define OP_MODE_MASK 3 - -/* --------------------------------------------------- */ - -/* - * Follow just what Moxa Must chip defines. - * - * When LCR register (offset 0x03) is written the following value, the Mus= t chip - * will enter enhanced mode. And a write to EFR (offset 0x02) bit 6,7 will - * change bank. - */ -#define MOXA_MUST_ENTER_ENHANCED 0xBF - -/* when enhanced mode is enabled, access to general bank register */ -#define MOXA_MUST_GDL_REGISTER 0x07 -#define MOXA_MUST_GDL_MASK 0x7F -#define MOXA_MUST_GDL_HAS_BAD_DATA 0x80 - -#define MOXA_MUST_LSR_RERR 0x80 /* error in receive FIFO */ -/* enhanced register bank select and enhanced mode setting register */ -/* This works only when LCR register equals to 0xBF */ -#define MOXA_MUST_EFR_REGISTER 0x02 -#define MOXA_MUST_EFR_EFRB_ENABLE 0x10 /* enhanced mode enable */ -/* enhanced register bank set 0, 1, 2 */ -#define MOXA_MUST_EFR_BANK0 0x00 -#define MOXA_MUST_EFR_BANK1 0x40 -#define MOXA_MUST_EFR_BANK2 0x80 -#define MOXA_MUST_EFR_BANK3 0xC0 -#define MOXA_MUST_EFR_BANK_MASK 0xC0 - -/* set XON1 value register, when LCR=3D0xBF and change to bank0 */ -#define MOXA_MUST_XON1_REGISTER 0x04 - -/* set XON2 value register, when LCR=3D0xBF and change to bank0 */ -#define MOXA_MUST_XON2_REGISTER 0x05 - -/* set XOFF1 value register, when LCR=3D0xBF and change to bank0 */ -#define MOXA_MUST_XOFF1_REGISTER 0x06 - -/* set XOFF2 value register, when LCR=3D0xBF and change to bank0 */ -#define MOXA_MUST_XOFF2_REGISTER 0x07 - -#define MOXA_MUST_RBRTL_REGISTER 0x04 -#define MOXA_MUST_RBRTH_REGISTER 0x05 -#define MOXA_MUST_RBRTI_REGISTER 0x06 -#define MOXA_MUST_THRTL_REGISTER 0x07 -#define MOXA_MUST_ENUM_REGISTER 0x04 -#define MOXA_MUST_HWID_REGISTER 0x05 -#define MOXA_MUST_ECR_REGISTER 0x06 -#define MOXA_MUST_CSR_REGISTER 0x07 - -#define MOXA_MUST_FCR_GDA_MODE_ENABLE 0x20 /* good data mode enable */ -#define MOXA_MUST_FCR_GDA_ONLY_ENABLE 0x10 /* only good data put into RxFI= FO */ - -#define MOXA_MUST_IER_ECTSI 0x80 /* enable CTS interrupt */ -#define MOXA_MUST_IER_ERTSI 0x40 /* enable RTS interrupt */ -#define MOXA_MUST_IER_XINT 0x20 /* enable Xon/Xoff interrupt */ -#define MOXA_MUST_IER_EGDAI 0x10 /* enable GDA interrupt */ - -#define MOXA_MUST_RECV_ISR (UART_IER_RDI | MOXA_MUST_IER_EGDAI) - -/* GDA interrupt pending */ -#define MOXA_MUST_IIR_GDA 0x1C -#define MOXA_MUST_IIR_RDA 0x04 -#define MOXA_MUST_IIR_RTO 0x0C -#define MOXA_MUST_IIR_LSR 0x06 - -/* received Xon/Xoff or specical interrupt pending */ -#define MOXA_MUST_IIR_XSC 0x10 - -/* RTS/CTS change state interrupt pending */ -#define MOXA_MUST_IIR_RTSCTS 0x20 -#define MOXA_MUST_IIR_MASK 0x3E - -#define MOXA_MUST_MCR_XON_FLAG 0x40 -#define MOXA_MUST_MCR_XON_ANY 0x80 -#define MOXA_MUST_MCR_TX_XON 0x08 - -#define MOXA_MUST_EFR_SF_MASK 0x0F /* software flow control on chip mask = value */ -#define MOXA_MUST_EFR_SF_TX1 0x08 /* send Xon1/Xoff1 */ -#define MOXA_MUST_EFR_SF_TX2 0x04 /* send Xon2/Xoff2 */ -#define MOXA_MUST_EFR_SF_TX12 0x0C /* send Xon1,Xon2/Xoff1,Xoff2 */ -#define MOXA_MUST_EFR_SF_TX_NO 0x00 /* don't send Xon/Xoff */ -#define MOXA_MUST_EFR_SF_TX_MASK 0x0C /* Tx software flow control mask */ -#define MOXA_MUST_EFR_SF_RX_NO 0x00 /* don't receive Xon/Xoff */ -#define MOXA_MUST_EFR_SF_RX1 0x02 /* receive Xon1/Xoff1 */ -#define MOXA_MUST_EFR_SF_RX2 0x01 /* receive Xon2/Xoff2 */ -#define MOXA_MUST_EFR_SF_RX12 0x03 /* receive Xon1,Xon2/Xoff1,Xoff2 */ -#define MOXA_MUST_EFR_SF_RX_MASK 0x03 /* Rx software flow control mask */ - -#define MXSERMAJOR 174 - -#define MXSER_BOARDS 4 /* Max. boards */ -#define MXSER_PORTS_PER_BOARD 8 /* Max. ports per board */ -#define MXSER_PORTS (MXSER_BOARDS * MXSER_PORTS_PER_BOARD) -#define MXSER_ISR_PASS_LIMIT 100 - -#define WAKEUP_CHARS 256 - -#define MXSER_BAUD_BASE 921600 -#define MXSER_CUSTOM_DIVISOR (MXSER_BAUD_BASE * 16) - -#define PCI_DEVICE_ID_MOXA_RC7000 0x0001 -#define PCI_DEVICE_ID_MOXA_CP102 0x1020 -#define PCI_DEVICE_ID_MOXA_CP102UL 0x1021 -#define PCI_DEVICE_ID_MOXA_CP102U 0x1022 -#define PCI_DEVICE_ID_MOXA_CP102UF 0x1023 -#define PCI_DEVICE_ID_MOXA_C104 0x1040 -#define PCI_DEVICE_ID_MOXA_CP104U 0x1041 -#define PCI_DEVICE_ID_MOXA_CP104JU 0x1042 -#define PCI_DEVICE_ID_MOXA_CP104EL 0x1043 -#define PCI_DEVICE_ID_MOXA_POS104UL 0x1044 -#define PCI_DEVICE_ID_MOXA_CB108 0x1080 -#define PCI_DEVICE_ID_MOXA_CP112UL 0x1120 -#define PCI_DEVICE_ID_MOXA_CT114 0x1140 -#define PCI_DEVICE_ID_MOXA_CP114 0x1141 -#define PCI_DEVICE_ID_MOXA_CB114 0x1142 -#define PCI_DEVICE_ID_MOXA_CP114UL 0x1143 -#define PCI_DEVICE_ID_MOXA_CP118U 0x1180 -#define PCI_DEVICE_ID_MOXA_CP118EL 0x1181 -#define PCI_DEVICE_ID_MOXA_CP132 0x1320 -#define PCI_DEVICE_ID_MOXA_CP132U 0x1321 -#define PCI_DEVICE_ID_MOXA_CP134U 0x1340 -#define PCI_DEVICE_ID_MOXA_CB134I 0x1341 -#define PCI_DEVICE_ID_MOXA_CP138U 0x1380 -#define PCI_DEVICE_ID_MOXA_C168 0x1680 -#define PCI_DEVICE_ID_MOXA_CP168U 0x1681 -#define PCI_DEVICE_ID_MOXA_CP168EL 0x1682 - -#define MXSER_NPORTS(ddata) ((ddata) & 0xffU) -#define MXSER_HIGHBAUD 0x0100 - -enum mxser_must_hwid { - MOXA_OTHER_UART =3D 0x00, - MOXA_MUST_MU150_HWID =3D 0x01, - MOXA_MUST_MU860_HWID =3D 0x02, -}; - -static const struct { - u8 type; - u8 fifo_size; - u8 rx_high_water; - u8 rx_low_water; - speed_t max_baud; -} Gpci_uart_info[] =3D { - { MOXA_OTHER_UART, 16, 14, 1, 921600 }, - { MOXA_MUST_MU150_HWID, 64, 48, 16, 230400 }, - { MOXA_MUST_MU860_HWID, 128, 96, 32, 921600 } -}; -#define UART_INFO_NUM ARRAY_SIZE(Gpci_uart_info) - -static const struct pci_device_id mxser_pcibrds[] =3D { - { PCI_DEVICE_DATA(MOXA, C168, 8) }, - { PCI_DEVICE_DATA(MOXA, C104, 4) }, - { PCI_DEVICE_DATA(MOXA, CP132, 2) }, - { PCI_DEVICE_DATA(MOXA, CP114, 4) }, - { PCI_DEVICE_DATA(MOXA, CT114, 4) }, - { PCI_DEVICE_DATA(MOXA, CP102, 2 | MXSER_HIGHBAUD) }, - { PCI_DEVICE_DATA(MOXA, CP104U, 4) }, - { PCI_DEVICE_DATA(MOXA, CP168U, 8) }, - { PCI_DEVICE_DATA(MOXA, CP132U, 2) }, - { PCI_DEVICE_DATA(MOXA, CP134U, 4) }, - { PCI_DEVICE_DATA(MOXA, CP104JU, 4) }, - { PCI_DEVICE_DATA(MOXA, RC7000, 8) }, /* RC7000 */ - { PCI_DEVICE_DATA(MOXA, CP118U, 8) }, - { PCI_DEVICE_DATA(MOXA, CP102UL, 2) }, - { PCI_DEVICE_DATA(MOXA, CP102U, 2) }, - { PCI_DEVICE_DATA(MOXA, CP118EL, 8) }, - { PCI_DEVICE_DATA(MOXA, CP168EL, 8) }, - { PCI_DEVICE_DATA(MOXA, CP104EL, 4) }, - { PCI_DEVICE_DATA(MOXA, CB108, 8) }, - { PCI_DEVICE_DATA(MOXA, CB114, 4) }, - { PCI_DEVICE_DATA(MOXA, CB134I, 4) }, - { PCI_DEVICE_DATA(MOXA, CP138U, 8) }, - { PCI_DEVICE_DATA(MOXA, POS104UL, 4) }, - { PCI_DEVICE_DATA(MOXA, CP114UL, 4) }, - { PCI_DEVICE_DATA(MOXA, CP102UF, 2) }, - { PCI_DEVICE_DATA(MOXA, CP112UL, 2) }, - { } -}; -MODULE_DEVICE_TABLE(pci, mxser_pcibrds); - -static int ttymajor =3D MXSERMAJOR; - -/* Variables for insmod */ - -MODULE_AUTHOR("Casper Yang"); -MODULE_DESCRIPTION("MOXA Smartio/Industio Family Multiport Board Device Dr= iver"); -module_param(ttymajor, int, 0); -MODULE_LICENSE("GPL"); - -struct mxser_board; - -struct mxser_port { - struct tty_port port; - struct mxser_board *board; - - unsigned long ioaddr; - unsigned long opmode_ioaddr; - - u8 rx_high_water; - u8 rx_low_water; - int type; /* UART type */ - - u8 x_char; /* xon/xoff character */ - u8 IER; /* Interrupt Enable Register */ - u8 MCR; /* Modem control register */ - u8 FCR; /* FIFO control register */ - - struct async_icount icount; /* kernel counters for 4 input interrupts */ - unsigned int timeout; - - u8 read_status_mask; - u8 ignore_status_mask; - u8 xmit_fifo_size; - - spinlock_t slock; -}; - -struct mxser_board { - unsigned int idx; - unsigned short nports; - int irq; - unsigned long vector; - - enum mxser_must_hwid must_hwid; - speed_t max_baud; - - struct mxser_port ports[] /* __counted_by(nports) */; -}; - -static DECLARE_BITMAP(mxser_boards, MXSER_BOARDS); -static struct tty_driver *mxvar_sdriver; - -static u8 __mxser_must_set_EFR(unsigned long baseio, u8 clear, u8 set, - bool restore_LCR) -{ - u8 oldlcr, efr; - - oldlcr =3D inb(baseio + UART_LCR); - outb(MOXA_MUST_ENTER_ENHANCED, baseio + UART_LCR); - - efr =3D inb(baseio + MOXA_MUST_EFR_REGISTER); - efr &=3D ~clear; - efr |=3D set; - - outb(efr, baseio + MOXA_MUST_EFR_REGISTER); - - if (restore_LCR) - outb(oldlcr, baseio + UART_LCR); - - return oldlcr; -} - -static u8 mxser_must_select_bank(unsigned long baseio, u8 bank) -{ - return __mxser_must_set_EFR(baseio, MOXA_MUST_EFR_BANK_MASK, bank, - false); -} - -static void mxser_set_must_xon1_value(unsigned long baseio, u8 value) -{ - u8 oldlcr =3D mxser_must_select_bank(baseio, MOXA_MUST_EFR_BANK0); - outb(value, baseio + MOXA_MUST_XON1_REGISTER); - outb(oldlcr, baseio + UART_LCR); -} - -static void mxser_set_must_xoff1_value(unsigned long baseio, u8 value) -{ - u8 oldlcr =3D mxser_must_select_bank(baseio, MOXA_MUST_EFR_BANK0); - outb(value, baseio + MOXA_MUST_XOFF1_REGISTER); - outb(oldlcr, baseio + UART_LCR); -} - -static void mxser_set_must_fifo_value(struct mxser_port *info) -{ - u8 oldlcr =3D mxser_must_select_bank(info->ioaddr, MOXA_MUST_EFR_BANK1); - outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTH_REGISTER); - outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTI_REGISTER); - outb(info->rx_low_water, info->ioaddr + MOXA_MUST_RBRTL_REGISTER); - outb(oldlcr, info->ioaddr + UART_LCR); -} - -static void mxser_set_must_enum_value(unsigned long baseio, u8 value) -{ - u8 oldlcr =3D mxser_must_select_bank(baseio, MOXA_MUST_EFR_BANK2); - outb(value, baseio + MOXA_MUST_ENUM_REGISTER); - outb(oldlcr, baseio + UART_LCR); -} - -static u8 mxser_get_must_hardware_id(unsigned long baseio) -{ - u8 oldlcr =3D mxser_must_select_bank(baseio, MOXA_MUST_EFR_BANK2); - u8 id =3D inb(baseio + MOXA_MUST_HWID_REGISTER); - outb(oldlcr, baseio + UART_LCR); - - return id; -} - -static void mxser_must_set_EFR(unsigned long baseio, u8 clear, u8 set) -{ - __mxser_must_set_EFR(baseio, clear, set, true); -} - -static void mxser_must_set_enhance_mode(unsigned long baseio, bool enable) -{ - mxser_must_set_EFR(baseio, - enable ? 0 : MOXA_MUST_EFR_EFRB_ENABLE, - enable ? MOXA_MUST_EFR_EFRB_ENABLE : 0); -} - -static void mxser_must_no_sw_flow_control(unsigned long baseio) -{ - mxser_must_set_EFR(baseio, MOXA_MUST_EFR_SF_MASK, 0); -} - -static void mxser_must_set_tx_sw_flow_control(unsigned long baseio, bool e= nable) -{ - mxser_must_set_EFR(baseio, MOXA_MUST_EFR_SF_TX_MASK, - enable ? MOXA_MUST_EFR_SF_TX1 : 0); -} - -static void mxser_must_set_rx_sw_flow_control(unsigned long baseio, bool e= nable) -{ - mxser_must_set_EFR(baseio, MOXA_MUST_EFR_SF_RX_MASK, - enable ? MOXA_MUST_EFR_SF_RX1 : 0); -} - -static enum mxser_must_hwid mxser_must_get_hwid(unsigned long io) -{ - u8 oldmcr, hwid; - int i; - - outb(0, io + UART_LCR); - mxser_must_set_enhance_mode(io, false); - oldmcr =3D inb(io + UART_MCR); - outb(0, io + UART_MCR); - mxser_set_must_xon1_value(io, 0x11); - if (inb(io + UART_MCR) !=3D 0) { - outb(oldmcr, io + UART_MCR); - return MOXA_OTHER_UART; - } - - hwid =3D mxser_get_must_hardware_id(io); - for (i =3D 1; i < UART_INFO_NUM; i++) /* 0 =3D OTHER_UART */ - if (hwid =3D=3D Gpci_uart_info[i].type) - return hwid; - - return MOXA_OTHER_UART; -} - -static bool mxser_16550A_or_MUST(struct mxser_port *info) -{ - return info->type =3D=3D PORT_16550A || info->board->must_hwid; -} - -static void mxser_process_txrx_fifo(struct mxser_port *info) -{ - unsigned int i; - - if (info->type =3D=3D PORT_16450 || info->type =3D=3D PORT_8250) { - info->rx_high_water =3D 1; - info->rx_low_water =3D 1; - info->xmit_fifo_size =3D 1; - return; - } - - for (i =3D 0; i < UART_INFO_NUM; i++) - if (info->board->must_hwid =3D=3D Gpci_uart_info[i].type) { - info->rx_low_water =3D Gpci_uart_info[i].rx_low_water; - info->rx_high_water =3D Gpci_uart_info[i].rx_high_water; - info->xmit_fifo_size =3D Gpci_uart_info[i].fifo_size; - break; - } -} - -static void __mxser_start_tx(struct mxser_port *info) -{ - outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); - info->IER |=3D UART_IER_THRI; - outb(info->IER, info->ioaddr + UART_IER); -} - -static void mxser_start_tx(struct mxser_port *info) -{ - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); - __mxser_start_tx(info); - spin_unlock_irqrestore(&info->slock, flags); -} - -static void __mxser_stop_tx(struct mxser_port *info) -{ - info->IER &=3D ~UART_IER_THRI; - outb(info->IER, info->ioaddr + UART_IER); -} - -static bool mxser_carrier_raised(struct tty_port *port) -{ - struct mxser_port *mp =3D container_of(port, struct mxser_port, port); - - return inb(mp->ioaddr + UART_MSR) & UART_MSR_DCD; -} - -static void mxser_dtr_rts(struct tty_port *port, bool active) -{ - struct mxser_port *mp =3D container_of(port, struct mxser_port, port); - unsigned long flags; - u8 mcr; - - spin_lock_irqsave(&mp->slock, flags); - mcr =3D inb(mp->ioaddr + UART_MCR); - if (active) - mcr |=3D UART_MCR_DTR | UART_MCR_RTS; - else - mcr &=3D ~(UART_MCR_DTR | UART_MCR_RTS); - outb(mcr, mp->ioaddr + UART_MCR); - spin_unlock_irqrestore(&mp->slock, flags); -} - -static int mxser_set_baud(struct tty_struct *tty, speed_t newspd) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned int quot =3D 0, baud; - unsigned char cval; - u64 timeout; - - if (newspd > info->board->max_baud) - return -1; - - if (newspd =3D=3D 134) { - quot =3D 2 * MXSER_BAUD_BASE / 269; - tty_encode_baud_rate(tty, 134, 134); - } else if (newspd) { - quot =3D MXSER_BAUD_BASE / newspd; - if (quot =3D=3D 0) - quot =3D 1; - baud =3D MXSER_BAUD_BASE / quot; - tty_encode_baud_rate(tty, baud, baud); - } else { - quot =3D 0; - } - - /* - * worst case (128 * 1000 * 10 * 18432) needs 35 bits, so divide in the - * u64 domain - */ - timeout =3D (u64)info->xmit_fifo_size * HZ * 10 * quot; - do_div(timeout, MXSER_BAUD_BASE); - info->timeout =3D timeout + HZ / 50; /* Add .02 seconds of slop */ - - if (quot) { - info->MCR |=3D UART_MCR_DTR; - outb(info->MCR, info->ioaddr + UART_MCR); - } else { - info->MCR &=3D ~UART_MCR_DTR; - outb(info->MCR, info->ioaddr + UART_MCR); - return 0; - } - - cval =3D inb(info->ioaddr + UART_LCR); - - outb(cval | UART_LCR_DLAB, info->ioaddr + UART_LCR); /* set DLAB */ - - outb(quot & 0xff, info->ioaddr + UART_DLL); /* LS of divisor */ - outb(quot >> 8, info->ioaddr + UART_DLM); /* MS of divisor */ - outb(cval, info->ioaddr + UART_LCR); /* reset DLAB */ - - if (C_BAUD(tty) =3D=3D BOTHER) { - quot =3D MXSER_BAUD_BASE % newspd; - quot *=3D 8; - if (quot % newspd > newspd / 2) { - quot /=3D newspd; - quot++; - } else - quot /=3D newspd; - - mxser_set_must_enum_value(info->ioaddr, quot); - } else { - mxser_set_must_enum_value(info->ioaddr, 0); - } - - return 0; -} - -static void mxser_handle_cts(struct tty_struct *tty, struct mxser_port *in= fo, - u8 msr) -{ - bool cts =3D msr & UART_MSR_CTS; - - if (tty->hw_stopped) { - if (cts) { - tty->hw_stopped =3D false; - - if (!mxser_16550A_or_MUST(info)) - __mxser_start_tx(info); - tty_wakeup(tty); - } - return; - } else if (cts) - return; - - tty->hw_stopped =3D true; - if (!mxser_16550A_or_MUST(info)) - __mxser_stop_tx(info); -} - -/* - * This routine is called to set the UART divisor registers to match - * the specified baud rate for a serial port. - */ -static void mxser_change_speed(struct tty_struct *tty, - const struct ktermios *old_termios) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned cflag, cval; - - cflag =3D tty->termios.c_cflag; - - if (mxser_set_baud(tty, tty_get_baud_rate(tty))) { - /* Use previous rate on a failure */ - if (old_termios) { - speed_t baud =3D tty_termios_baud_rate(old_termios); - tty_encode_baud_rate(tty, baud, baud); - } - } - - /* byte size and parity */ - cval =3D UART_LCR_WLEN(tty_get_char_size(tty->termios.c_cflag)); - - if (cflag & CSTOPB) - cval |=3D UART_LCR_STOP; - if (cflag & PARENB) - cval |=3D UART_LCR_PARITY; - if (!(cflag & PARODD)) - cval |=3D UART_LCR_EPAR; - if (cflag & CMSPAR) - cval |=3D UART_LCR_SPAR; - - info->FCR =3D 0; - if (info->board->must_hwid) { - info->FCR |=3D UART_FCR_ENABLE_FIFO | - MOXA_MUST_FCR_GDA_MODE_ENABLE; - mxser_set_must_fifo_value(info); - } else if (info->type !=3D PORT_8250 && info->type !=3D PORT_16450) { - info->FCR |=3D UART_FCR_ENABLE_FIFO; - switch (info->rx_high_water) { - case 1: - info->FCR |=3D UART_FCR_TRIGGER_1; - break; - case 4: - info->FCR |=3D UART_FCR_TRIGGER_4; - break; - case 8: - info->FCR |=3D UART_FCR_TRIGGER_8; - break; - default: - info->FCR |=3D UART_FCR_TRIGGER_14; - break; - } - } - - /* CTS flow control flag and modem status interrupts */ - info->IER &=3D ~UART_IER_MSI; - info->MCR &=3D ~UART_MCR_AFE; - tty_port_set_cts_flow(&info->port, cflag & CRTSCTS); - if (cflag & CRTSCTS) { - info->IER |=3D UART_IER_MSI; - if (mxser_16550A_or_MUST(info)) { - info->MCR |=3D UART_MCR_AFE; - } else { - mxser_handle_cts(tty, info, - inb(info->ioaddr + UART_MSR)); - } - } - outb(info->MCR, info->ioaddr + UART_MCR); - tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL); - if (~cflag & CLOCAL) - info->IER |=3D UART_IER_MSI; - outb(info->IER, info->ioaddr + UART_IER); - - /* - * Set up parity check flag - */ - info->read_status_mask =3D UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; - if (I_INPCK(tty)) - info->read_status_mask |=3D UART_LSR_FE | UART_LSR_PE; - if (I_BRKINT(tty) || I_PARMRK(tty)) - info->read_status_mask |=3D UART_LSR_BI; - - info->ignore_status_mask =3D 0; - - if (I_IGNBRK(tty)) { - info->ignore_status_mask |=3D UART_LSR_BI; - info->read_status_mask |=3D UART_LSR_BI; - /* - * If we're ignore parity and break indicators, ignore - * overruns too. (For real raw support). - */ - if (I_IGNPAR(tty)) { - info->ignore_status_mask |=3D - UART_LSR_OE | - UART_LSR_PE | - UART_LSR_FE; - info->read_status_mask |=3D - UART_LSR_OE | - UART_LSR_PE | - UART_LSR_FE; - } - } - if (info->board->must_hwid) { - mxser_set_must_xon1_value(info->ioaddr, START_CHAR(tty)); - mxser_set_must_xoff1_value(info->ioaddr, STOP_CHAR(tty)); - mxser_must_set_rx_sw_flow_control(info->ioaddr, I_IXON(tty)); - mxser_must_set_tx_sw_flow_control(info->ioaddr, I_IXOFF(tty)); - } - - - outb(info->FCR, info->ioaddr + UART_FCR); - outb(cval, info->ioaddr + UART_LCR); -} - -static u8 mxser_check_modem_status(struct tty_struct *tty, - struct mxser_port *port) -{ - u8 msr =3D inb(port->ioaddr + UART_MSR); - - if (!(msr & UART_MSR_ANY_DELTA)) - return msr; - - /* update input line counters */ - if (msr & UART_MSR_TERI) - port->icount.rng++; - if (msr & UART_MSR_DDSR) - port->icount.dsr++; - if (msr & UART_MSR_DDCD) - port->icount.dcd++; - if (msr & UART_MSR_DCTS) - port->icount.cts++; - wake_up_interruptible(&port->port.delta_msr_wait); - - if (tty_port_check_carrier(&port->port) && (msr & UART_MSR_DDCD)) { - if (msr & UART_MSR_DCD) - wake_up_interruptible(&port->port.open_wait); - } - - if (tty_port_cts_enabled(&port->port)) - mxser_handle_cts(tty, port, msr); - - return msr; -} - -static void mxser_disable_and_clear_FIFO(struct mxser_port *info) -{ - u8 fcr =3D UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT; - - if (info->board->must_hwid) - fcr |=3D MOXA_MUST_FCR_GDA_MODE_ENABLE; - - outb(fcr, info->ioaddr + UART_FCR); -} - -static int mxser_activate(struct tty_port *port, struct tty_struct *tty) -{ - struct mxser_port *info =3D container_of(port, struct mxser_port, port); - unsigned long flags; - int ret; - - ret =3D tty_port_alloc_xmit_buf(port); - if (ret < 0) - return ret; - - spin_lock_irqsave(&info->slock, flags); - - if (!info->type) { - set_bit(TTY_IO_ERROR, &tty->flags); - spin_unlock_irqrestore(&info->slock, flags); - ret =3D 0; - goto err_free_xmit; - } - - /* - * Clear the FIFO buffers and disable them - * (they will be reenabled in mxser_change_speed()) - */ - mxser_disable_and_clear_FIFO(info); - - /* - * At this point there's no way the LSR could still be 0xFF; - * if it is, then bail out, because there's likely no UART - * here. - */ - if (inb(info->ioaddr + UART_LSR) =3D=3D 0xff) { - spin_unlock_irqrestore(&info->slock, flags); - if (capable(CAP_SYS_ADMIN)) { - set_bit(TTY_IO_ERROR, &tty->flags); - return 0; - } - - ret =3D -ENODEV; - goto err_free_xmit; - } - - /* - * Clear the interrupt registers. - */ - (void) inb(info->ioaddr + UART_LSR); - (void) inb(info->ioaddr + UART_RX); - (void) inb(info->ioaddr + UART_IIR); - (void) inb(info->ioaddr + UART_MSR); - - /* - * Now, initialize the UART - */ - outb(UART_LCR_WLEN8, info->ioaddr + UART_LCR); /* reset DLAB */ - info->MCR =3D UART_MCR_DTR | UART_MCR_RTS; - outb(info->MCR, info->ioaddr + UART_MCR); - - /* - * Finally, enable interrupts - */ - info->IER =3D UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; - - if (info->board->must_hwid) - info->IER |=3D MOXA_MUST_IER_EGDAI; - outb(info->IER, info->ioaddr + UART_IER); /* enable interrupts */ - - /* - * And clear the interrupt registers again for luck. - */ - (void) inb(info->ioaddr + UART_LSR); - (void) inb(info->ioaddr + UART_RX); - (void) inb(info->ioaddr + UART_IIR); - (void) inb(info->ioaddr + UART_MSR); - - clear_bit(TTY_IO_ERROR, &tty->flags); - kfifo_reset(&port->xmit_fifo); - - /* - * and set the speed of the serial port - */ - mxser_change_speed(tty, NULL); - spin_unlock_irqrestore(&info->slock, flags); - - return 0; -err_free_xmit: - tty_port_free_xmit_buf(port); - return ret; -} - -/* - * To stop accepting input, we disable the receive line status interrupts,= and - * tell the interrupt driver to stop checking the data ready bit in the li= ne - * status register. - */ -static void mxser_stop_rx(struct mxser_port *info) -{ - info->IER &=3D ~UART_IER_RLSI; - if (info->board->must_hwid) - info->IER &=3D ~MOXA_MUST_RECV_ISR; - - outb(info->IER, info->ioaddr + UART_IER); -} - -/* - * This routine will shutdown a serial port - */ -static void mxser_shutdown_port(struct tty_port *port) -{ - struct mxser_port *info =3D container_of(port, struct mxser_port, port); - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); - - mxser_stop_rx(info); - - /* - * clear delta_msr_wait queue to avoid mem leaks: we may free the irq - * here so the queue might never be waken up - */ - wake_up_interruptible(&info->port.delta_msr_wait); - - info->IER =3D 0; - outb(0x00, info->ioaddr + UART_IER); - - /* clear Rx/Tx FIFO's */ - mxser_disable_and_clear_FIFO(info); - - /* read data port to reset things */ - (void) inb(info->ioaddr + UART_RX); - - - if (info->board->must_hwid) - mxser_must_no_sw_flow_control(info->ioaddr); - - spin_unlock_irqrestore(&info->slock, flags); - - /* make sure ISR is not running while we free the buffer */ - synchronize_irq(info->board->irq); - - tty_port_free_xmit_buf(port); -} - -/* - * This routine is called whenever a serial port is opened. It - * enables interrupts for a serial port, linking in its async structure in= to - * the IRQ chain. It also performs the serial-specific - * initialization for the tty structure. - */ -static int mxser_open(struct tty_struct *tty, struct file *filp) -{ - struct tty_port *tport =3D tty->port; - struct mxser_port *port =3D container_of(tport, struct mxser_port, port); - - tty->driver_data =3D port; - - return tty_port_open(tport, tty, filp); -} - -static void mxser_flush_buffer(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); - kfifo_reset(&info->port.xmit_fifo); - - outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, - info->ioaddr + UART_FCR); - - spin_unlock_irqrestore(&info->slock, flags); - - tty_wakeup(tty); -} - -static void mxser_close(struct tty_struct *tty, struct file *filp) -{ - tty_port_close(tty->port, tty, filp); -} - -static ssize_t mxser_write(struct tty_struct *tty, const u8 *buf, size_t c= ount) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - size_t written; - bool is_empty; - - spin_lock_irqsave(&info->slock, flags); - written =3D kfifo_in(&info->port.xmit_fifo, buf, count); - is_empty =3D kfifo_is_empty(&info->port.xmit_fifo); - spin_unlock_irqrestore(&info->slock, flags); - - if (!is_empty && !tty->flow.stopped) - if (!tty->hw_stopped || mxser_16550A_or_MUST(info)) - mxser_start_tx(info); - - return written; -} - -static int mxser_put_char(struct tty_struct *tty, u8 ch) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - int ret; - - spin_lock_irqsave(&info->slock, flags); - ret =3D kfifo_put(&info->port.xmit_fifo, ch); - spin_unlock_irqrestore(&info->slock, flags); - - return ret; -} - - -static void mxser_flush_chars(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - - if (kfifo_is_empty(&info->port.xmit_fifo) || tty->flow.stopped || - (tty->hw_stopped && !mxser_16550A_or_MUST(info))) - return; - - mxser_start_tx(info); -} - -static unsigned int mxser_write_room(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - - return kfifo_avail(&info->port.xmit_fifo); -} - -static unsigned int mxser_chars_in_buffer(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - - return kfifo_len(&info->port.xmit_fifo); -} - -/* - * ------------------------------------------------------------ - * friends of mxser_ioctl() - * ------------------------------------------------------------ - */ -static int mxser_get_serial_info(struct tty_struct *tty, - struct serial_struct *ss) -{ - struct mxser_port *info =3D tty->driver_data; - struct tty_port *port =3D &info->port; - unsigned int closing_wait, close_delay; - - mutex_lock(&port->mutex); - - close_delay =3D jiffies_to_msecs(info->port.close_delay) / 10; - closing_wait =3D info->port.closing_wait; - if (closing_wait !=3D ASYNC_CLOSING_WAIT_NONE) - closing_wait =3D jiffies_to_msecs(closing_wait) / 10; - - ss->type =3D info->type; - ss->line =3D tty->index; - ss->port =3D info->ioaddr; - ss->irq =3D info->board->irq; - ss->flags =3D info->port.flags; - ss->baud_base =3D MXSER_BAUD_BASE; - ss->close_delay =3D close_delay; - ss->closing_wait =3D closing_wait; - ss->custom_divisor =3D MXSER_CUSTOM_DIVISOR; - mutex_unlock(&port->mutex); - return 0; -} - -static int mxser_set_serial_info(struct tty_struct *tty, - struct serial_struct *ss) -{ - struct mxser_port *info =3D tty->driver_data; - struct tty_port *port =3D &info->port; - speed_t baud; - unsigned long sl_flags; - unsigned int old_speed, close_delay, closing_wait; - int retval =3D 0; - - if (tty_io_error(tty)) - return -EIO; - - mutex_lock(&port->mutex); - - if (ss->irq !=3D info->board->irq || - ss->port !=3D info->ioaddr) { - mutex_unlock(&port->mutex); - return -EINVAL; - } - - old_speed =3D port->flags & ASYNC_SPD_MASK; - - close_delay =3D msecs_to_jiffies(ss->close_delay * 10); - closing_wait =3D ss->closing_wait; - if (closing_wait !=3D ASYNC_CLOSING_WAIT_NONE) - closing_wait =3D msecs_to_jiffies(closing_wait * 10); - - if (!capable(CAP_SYS_ADMIN)) { - if ((ss->baud_base !=3D MXSER_BAUD_BASE) || - (close_delay !=3D port->close_delay) || - (closing_wait !=3D port->closing_wait) || - ((ss->flags & ~ASYNC_USR_MASK) !=3D (port->flags & ~ASYNC_USR_MASK))) { - mutex_unlock(&port->mutex); - return -EPERM; - } - port->flags =3D (port->flags & ~ASYNC_USR_MASK) | - (ss->flags & ASYNC_USR_MASK); - } else { - /* - * OK, past this point, all the error checking has been done. - * At this point, we start making changes..... - */ - port->flags =3D ((port->flags & ~ASYNC_FLAGS) | - (ss->flags & ASYNC_FLAGS)); - port->close_delay =3D close_delay; - port->closing_wait =3D closing_wait; - if ((port->flags & ASYNC_SPD_MASK) =3D=3D ASYNC_SPD_CUST && - (ss->baud_base !=3D MXSER_BAUD_BASE || - ss->custom_divisor !=3D - MXSER_CUSTOM_DIVISOR)) { - if (ss->custom_divisor =3D=3D 0) { - mutex_unlock(&port->mutex); - return -EINVAL; - } - baud =3D ss->baud_base / ss->custom_divisor; - tty_encode_baud_rate(tty, baud, baud); - } - - info->type =3D ss->type; - - mxser_process_txrx_fifo(info); - } - - if (tty_port_initialized(port)) { - if (old_speed !=3D (port->flags & ASYNC_SPD_MASK)) { - spin_lock_irqsave(&info->slock, sl_flags); - mxser_change_speed(tty, NULL); - spin_unlock_irqrestore(&info->slock, sl_flags); - } - } else { - retval =3D mxser_activate(port, tty); - if (retval =3D=3D 0) - tty_port_set_initialized(port, true); - } - mutex_unlock(&port->mutex); - return retval; -} - -/* - * mxser_get_lsr_info - get line status register info - * - * Purpose: Let user call ioctl() to get info when the UART physically - * is emptied. On bus types like RS485, the transmitter must - * release the bus after transmitting. This must be done when - * the transmit shift register is empty, not be done when the - * transmit holding register is empty. This functionality - * allows an RS485 driver to be written in user space. - */ -static int mxser_get_lsr_info(struct mxser_port *info, - unsigned int __user *value) -{ - unsigned char status; - unsigned int result; - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); - status =3D inb(info->ioaddr + UART_LSR); - spin_unlock_irqrestore(&info->slock, flags); - result =3D ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0); - return put_user(result, value); -} - -static int mxser_tiocmget(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned char control; - unsigned long flags; - u8 msr; - - if (tty_io_error(tty)) - return -EIO; - - spin_lock_irqsave(&info->slock, flags); - control =3D info->MCR; - msr =3D mxser_check_modem_status(tty, info); - spin_unlock_irqrestore(&info->slock, flags); - - return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) | - ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) | - ((msr & UART_MSR_DCD) ? TIOCM_CAR : 0) | - ((msr & UART_MSR_RI) ? TIOCM_RNG : 0) | - ((msr & UART_MSR_DSR) ? TIOCM_DSR : 0) | - ((msr & UART_MSR_CTS) ? TIOCM_CTS : 0); -} - -static int mxser_tiocmset(struct tty_struct *tty, - unsigned int set, unsigned int clear) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - - if (tty_io_error(tty)) - return -EIO; - - spin_lock_irqsave(&info->slock, flags); - - if (set & TIOCM_RTS) - info->MCR |=3D UART_MCR_RTS; - if (set & TIOCM_DTR) - info->MCR |=3D UART_MCR_DTR; - - if (clear & TIOCM_RTS) - info->MCR &=3D ~UART_MCR_RTS; - if (clear & TIOCM_DTR) - info->MCR &=3D ~UART_MCR_DTR; - - outb(info->MCR, info->ioaddr + UART_MCR); - spin_unlock_irqrestore(&info->slock, flags); - return 0; -} - -static int mxser_cflags_changed(struct mxser_port *info, unsigned long arg, - struct async_icount *cprev) -{ - struct async_icount cnow; - unsigned long flags; - int ret; - - spin_lock_irqsave(&info->slock, flags); - cnow =3D info->icount; /* atomic copy */ - spin_unlock_irqrestore(&info->slock, flags); - - ret =3D ((arg & TIOCM_RNG) && (cnow.rng !=3D cprev->rng)) || - ((arg & TIOCM_DSR) && (cnow.dsr !=3D cprev->dsr)) || - ((arg & TIOCM_CD) && (cnow.dcd !=3D cprev->dcd)) || - ((arg & TIOCM_CTS) && (cnow.cts !=3D cprev->cts)); - - *cprev =3D cnow; - - return ret; -} - -/* We should likely switch to TIOCGRS485/TIOCSRS485. */ -static int mxser_ioctl_op_mode(struct mxser_port *port, int index, bool se= t, - int __user *u_opmode) -{ - int opmode, p =3D index % 4; - int shiftbit =3D p * 2; - u8 val; - - if (port->board->must_hwid !=3D MOXA_MUST_MU860_HWID) - return -EFAULT; - - if (set) { - if (get_user(opmode, u_opmode)) - return -EFAULT; - - if (opmode & ~OP_MODE_MASK) - return -EINVAL; - - spin_lock_irq(&port->slock); - val =3D inb(port->opmode_ioaddr); - val &=3D ~(OP_MODE_MASK << shiftbit); - val |=3D (opmode << shiftbit); - outb(val, port->opmode_ioaddr); - spin_unlock_irq(&port->slock); - - return 0; - } - - spin_lock_irq(&port->slock); - opmode =3D inb(port->opmode_ioaddr) >> shiftbit; - spin_unlock_irq(&port->slock); - - return put_user(opmode & OP_MODE_MASK, u_opmode); -} - -static int mxser_ioctl(struct tty_struct *tty, - unsigned int cmd, unsigned long arg) -{ - struct mxser_port *info =3D tty->driver_data; - struct async_icount cnow; - unsigned long flags; - void __user *argp =3D (void __user *)arg; - - if (cmd =3D=3D MOXA_SET_OP_MODE || cmd =3D=3D MOXA_GET_OP_MODE) - return mxser_ioctl_op_mode(info, tty->index, - cmd =3D=3D MOXA_SET_OP_MODE, argp); - - if (cmd !=3D TIOCMIWAIT && tty_io_error(tty)) - return -EIO; - - switch (cmd) { - case TIOCSERGETLSR: /* Get line status register */ - return mxser_get_lsr_info(info, argp); - /* - * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change - * - mask passed in arg for lines of interest - * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking) - * Caller should use TIOCGICOUNT to see which one it was - */ - case TIOCMIWAIT: - spin_lock_irqsave(&info->slock, flags); - cnow =3D info->icount; /* note the counters on entry */ - spin_unlock_irqrestore(&info->slock, flags); - - return wait_event_interruptible(info->port.delta_msr_wait, - mxser_cflags_changed(info, arg, &cnow)); - default: - return -ENOIOCTLCMD; - } - return 0; -} - - /* - * Get counter of input serial line interrupts (DCD,RI,DSR,CTS) - * Return: write counters to the user passed counter struct - * NB: both 1->0 and 0->1 transitions are counted except for - * RI where only 0->1 is counted. - */ - -static int mxser_get_icount(struct tty_struct *tty, - struct serial_icounter_struct *icount) - -{ - struct mxser_port *info =3D tty->driver_data; - struct async_icount cnow; - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); - cnow =3D info->icount; - spin_unlock_irqrestore(&info->slock, flags); - - icount->frame =3D cnow.frame; - icount->brk =3D cnow.brk; - icount->overrun =3D cnow.overrun; - icount->buf_overrun =3D cnow.buf_overrun; - icount->parity =3D cnow.parity; - icount->rx =3D cnow.rx; - icount->tx =3D cnow.tx; - icount->cts =3D cnow.cts; - icount->dsr =3D cnow.dsr; - icount->rng =3D cnow.rng; - icount->dcd =3D cnow.dcd; - return 0; -} - -/* - * This routine is called by the upper-layer tty layer to signal that - * incoming characters should be throttled. - */ -static void mxser_throttle(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - - if (I_IXOFF(tty)) { - if (info->board->must_hwid) { - info->IER &=3D ~MOXA_MUST_RECV_ISR; - outb(info->IER, info->ioaddr + UART_IER); - } else { - info->x_char =3D STOP_CHAR(tty); - outb(0, info->ioaddr + UART_IER); - info->IER |=3D UART_IER_THRI; - outb(info->IER, info->ioaddr + UART_IER); - } - } - - if (C_CRTSCTS(tty)) { - info->MCR &=3D ~UART_MCR_RTS; - outb(info->MCR, info->ioaddr + UART_MCR); - } -} - -static void mxser_unthrottle(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - - /* startrx */ - if (I_IXOFF(tty)) { - if (info->x_char) - info->x_char =3D 0; - else { - if (info->board->must_hwid) { - info->IER |=3D MOXA_MUST_RECV_ISR; - outb(info->IER, info->ioaddr + UART_IER); - } else { - info->x_char =3D START_CHAR(tty); - outb(0, info->ioaddr + UART_IER); - info->IER |=3D UART_IER_THRI; - outb(info->IER, info->ioaddr + UART_IER); - } - } - } - - if (C_CRTSCTS(tty)) { - info->MCR |=3D UART_MCR_RTS; - outb(info->MCR, info->ioaddr + UART_MCR); - } -} - -/* - * mxser_stop() and mxser_start() - * - * This routines are called before setting or resetting tty->flow.stopped. - * They enable or disable transmitter interrupts, as necessary. - */ -static void mxser_stop(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); - if (info->IER & UART_IER_THRI) - __mxser_stop_tx(info); - spin_unlock_irqrestore(&info->slock, flags); -} - -static void mxser_start(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); - if (!kfifo_is_empty(&info->port.xmit_fifo)) - __mxser_start_tx(info); - spin_unlock_irqrestore(&info->slock, flags); -} - -static void mxser_set_termios(struct tty_struct *tty, - const struct ktermios *old_termios) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); - mxser_change_speed(tty, old_termios); - spin_unlock_irqrestore(&info->slock, flags); - - if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { - tty->hw_stopped =3D false; - mxser_start(tty); - } - - /* Handle sw stopped */ - if ((old_termios->c_iflag & IXON) && !I_IXON(tty)) { - tty->flow.stopped =3D 0; - - if (info->board->must_hwid) { - spin_lock_irqsave(&info->slock, flags); - mxser_must_set_rx_sw_flow_control(info->ioaddr, false); - spin_unlock_irqrestore(&info->slock, flags); - } - - mxser_start(tty); - } -} - -static bool mxser_tx_empty(struct mxser_port *info) -{ - unsigned long flags; - u8 lsr; - - spin_lock_irqsave(&info->slock, flags); - lsr =3D inb(info->ioaddr + UART_LSR); - spin_unlock_irqrestore(&info->slock, flags); - - return !(lsr & UART_LSR_TEMT); -} - -/* - * mxser_wait_until_sent() --- wait until the transmitter is empty - */ -static void mxser_wait_until_sent(struct tty_struct *tty, int timeout) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long expire, char_time; - - if (info->type =3D=3D PORT_UNKNOWN) - return; - - if (info->xmit_fifo_size =3D=3D 0) - return; /* Just in case.... */ - - /* - * Set the check interval to be 1/5 of the estimated time to - * send a single character, and make it at least 1. The check - * interval should also be less than the timeout. - * - * Note: we have to use pretty tight timings here to satisfy - * the NIST-PCTS. - */ - char_time =3D (info->timeout - HZ / 50) / info->xmit_fifo_size; - char_time =3D char_time / 5; - if (char_time =3D=3D 0) - char_time =3D 1; - if (timeout && timeout < char_time) - char_time =3D timeout; - - char_time =3D jiffies_to_msecs(char_time); - - /* - * If the transmitter hasn't cleared in twice the approximate - * amount of time to send the entire FIFO, it probably won't - * ever clear. This assumes the UART isn't doing flow - * control, which is currently the case. Hence, if it ever - * takes longer than info->timeout, this is probably due to a - * UART bug of some kind. So, we clamp the timeout parameter at - * 2*info->timeout. - */ - if (!timeout || timeout > 2 * info->timeout) - timeout =3D 2 * info->timeout; - - expire =3D jiffies + timeout; - - while (mxser_tx_empty(info)) { - msleep_interruptible(char_time); - if (signal_pending(current)) - break; - if (time_after(jiffies, expire)) - break; - } -} - -/* - * This routine is called by tty_hangup() when a hangup is signaled. - */ -static void mxser_hangup(struct tty_struct *tty) -{ - struct mxser_port *info =3D tty->driver_data; - - mxser_flush_buffer(tty); - tty_port_hangup(&info->port); -} - -/* - * mxser_rs_break() --- routine which turns the break handling on or off - */ -static int mxser_rs_break(struct tty_struct *tty, int break_state) -{ - struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - u8 lcr; - - spin_lock_irqsave(&info->slock, flags); - lcr =3D inb(info->ioaddr + UART_LCR); - if (break_state =3D=3D -1) - lcr |=3D UART_LCR_SBC; - else - lcr &=3D ~UART_LCR_SBC; - outb(lcr, info->ioaddr + UART_LCR); - spin_unlock_irqrestore(&info->slock, flags); - - return 0; -} - -static bool mxser_receive_chars_new(struct mxser_port *port, u8 status) -{ - enum mxser_must_hwid hwid =3D port->board->must_hwid; - u8 gdl; - - if (hwid =3D=3D MOXA_OTHER_UART) - return false; - if (status & (UART_LSR_BRK_ERROR_BITS | MOXA_MUST_LSR_RERR)) - return false; - - gdl =3D inb(port->ioaddr + MOXA_MUST_GDL_REGISTER); - if (hwid =3D=3D MOXA_MUST_MU150_HWID) - gdl &=3D MOXA_MUST_GDL_MASK; - - while (gdl--) { - u8 ch =3D inb(port->ioaddr + UART_RX); - if (!tty_insert_flip_char(&port->port, ch, 0)) - port->icount.buf_overrun++; - } - - return true; -} - -static u8 mxser_receive_chars_old(struct tty_struct *tty, - struct mxser_port *port, u8 status) -{ - enum mxser_must_hwid hwid =3D port->board->must_hwid; - int ignored =3D 0; - int max =3D 256; - u8 ch; - - do { - if (max-- < 0) - break; - - ch =3D inb(port->ioaddr + UART_RX); - if (hwid && (status & UART_LSR_OE)) - outb(port->FCR | UART_FCR_CLEAR_RCVR, - port->ioaddr + UART_FCR); - status &=3D port->read_status_mask; - if (status & port->ignore_status_mask) { - if (++ignored > 100) - break; - } else { - u8 flag =3D 0; - if (status & UART_LSR_BRK_ERROR_BITS) { - if (status & UART_LSR_BI) { - flag =3D TTY_BREAK; - port->icount.brk++; - - if (port->port.flags & ASYNC_SAK) - do_SAK(tty); - } else if (status & UART_LSR_PE) { - flag =3D TTY_PARITY; - port->icount.parity++; - } else if (status & UART_LSR_FE) { - flag =3D TTY_FRAME; - port->icount.frame++; - } else if (status & UART_LSR_OE) { - flag =3D TTY_OVERRUN; - port->icount.overrun++; - } - } - if (!tty_insert_flip_char(&port->port, ch, flag)) { - port->icount.buf_overrun++; - break; - } - } - - if (hwid) - break; - - status =3D inb(port->ioaddr + UART_LSR); - } while (status & UART_LSR_DR); - - return status; -} - -static u8 mxser_receive_chars(struct tty_struct *tty, - struct mxser_port *port, u8 status) -{ - if (!mxser_receive_chars_new(port, status)) - status =3D mxser_receive_chars_old(tty, port, status); - - tty_flip_buffer_push(&port->port); - - return status; -} - -static void mxser_transmit_chars(struct tty_struct *tty, struct mxser_port= *port) -{ - int count; - - if (port->x_char) { - outb(port->x_char, port->ioaddr + UART_TX); - port->x_char =3D 0; - port->icount.tx++; - return; - } - - if (kfifo_is_empty(&port->port.xmit_fifo) || tty->flow.stopped || - (tty->hw_stopped && !mxser_16550A_or_MUST(port))) { - __mxser_stop_tx(port); - return; - } - - count =3D port->xmit_fifo_size; - do { - u8 c; - - if (!kfifo_get(&port->port.xmit_fifo, &c)) - break; - - outb(c, port->ioaddr + UART_TX); - port->icount.tx++; - } while (--count > 0); - - if (kfifo_len(&port->port.xmit_fifo) < WAKEUP_CHARS) - tty_wakeup(tty); - - if (kfifo_is_empty(&port->port.xmit_fifo)) - __mxser_stop_tx(port); -} - -static bool mxser_port_isr(struct mxser_port *port) -{ - struct tty_struct *tty; - u8 iir, status; - bool error =3D false; - - iir =3D inb(port->ioaddr + UART_IIR); - if (iir & UART_IIR_NO_INT) - return true; - - iir &=3D MOXA_MUST_IIR_MASK; - tty =3D tty_port_tty_get(&port->port); - if (!tty) { - status =3D inb(port->ioaddr + UART_LSR); - outb(port->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, - port->ioaddr + UART_FCR); - inb(port->ioaddr + UART_MSR); - - error =3D true; - goto put_tty; - } - - status =3D inb(port->ioaddr + UART_LSR); - - if (port->board->must_hwid) { - if (iir =3D=3D MOXA_MUST_IIR_GDA || - iir =3D=3D MOXA_MUST_IIR_RDA || - iir =3D=3D MOXA_MUST_IIR_RTO || - iir =3D=3D MOXA_MUST_IIR_LSR) - status =3D mxser_receive_chars(tty, port, status); - } else { - status &=3D port->read_status_mask; - if (status & UART_LSR_DR) - status =3D mxser_receive_chars(tty, port, status); - } - - mxser_check_modem_status(tty, port); - - if (port->board->must_hwid) { - if (iir =3D=3D 0x02 && (status & UART_LSR_THRE)) - mxser_transmit_chars(tty, port); - } else { - if (status & UART_LSR_THRE) - mxser_transmit_chars(tty, port); - } - -put_tty: - tty_kref_put(tty); - - return error; -} - -/* - * This is the serial driver's generic interrupt routine - */ -static irqreturn_t mxser_interrupt(int irq, void *dev_id) -{ - struct mxser_board *brd =3D dev_id; - struct mxser_port *port; - unsigned int int_cnt, pass_counter =3D 0; - unsigned int i, max =3D brd->nports; - int handled =3D IRQ_NONE; - u8 irqbits, bits, mask =3D BIT(max) - 1; - - while (pass_counter++ < MXSER_ISR_PASS_LIMIT) { - irqbits =3D inb(brd->vector) & mask; - if (irqbits =3D=3D mask) - break; - - handled =3D IRQ_HANDLED; - for (i =3D 0, bits =3D 1; i < max; i++, irqbits |=3D bits, bits <<=3D 1)= { - if (irqbits =3D=3D mask) - break; - if (bits & irqbits) - continue; - port =3D &brd->ports[i]; - - int_cnt =3D 0; - spin_lock(&port->slock); - do { - if (mxser_port_isr(port)) - break; - } while (int_cnt++ < MXSER_ISR_PASS_LIMIT); - spin_unlock(&port->slock); - } - } - - return handled; -} - -static const struct tty_operations mxser_ops =3D { - .open =3D mxser_open, - .close =3D mxser_close, - .write =3D mxser_write, - .put_char =3D mxser_put_char, - .flush_chars =3D mxser_flush_chars, - .write_room =3D mxser_write_room, - .chars_in_buffer =3D mxser_chars_in_buffer, - .flush_buffer =3D mxser_flush_buffer, - .ioctl =3D mxser_ioctl, - .throttle =3D mxser_throttle, - .unthrottle =3D mxser_unthrottle, - .set_termios =3D mxser_set_termios, - .stop =3D mxser_stop, - .start =3D mxser_start, - .hangup =3D mxser_hangup, - .break_ctl =3D mxser_rs_break, - .wait_until_sent =3D mxser_wait_until_sent, - .tiocmget =3D mxser_tiocmget, - .tiocmset =3D mxser_tiocmset, - .set_serial =3D mxser_set_serial_info, - .get_serial =3D mxser_get_serial_info, - .get_icount =3D mxser_get_icount, -}; - -static const struct tty_port_operations mxser_port_ops =3D { - .carrier_raised =3D mxser_carrier_raised, - .dtr_rts =3D mxser_dtr_rts, - .activate =3D mxser_activate, - .shutdown =3D mxser_shutdown_port, -}; - -/* - * The MOXA Smartio/Industio serial driver boot-time initialization code! - */ - -static void mxser_initbrd(struct mxser_board *brd, bool high_baud) -{ - struct mxser_port *info; - unsigned int i; - bool is_mu860; - - brd->must_hwid =3D mxser_must_get_hwid(brd->ports[0].ioaddr); - is_mu860 =3D brd->must_hwid =3D=3D MOXA_MUST_MU860_HWID; - - for (i =3D 0; i < UART_INFO_NUM; i++) { - if (Gpci_uart_info[i].type =3D=3D brd->must_hwid) { - brd->max_baud =3D Gpci_uart_info[i].max_baud; - - /* exception....CP-102 */ - if (high_baud) - brd->max_baud =3D 921600; - break; - } - } - - if (is_mu860) { - /* set to RS232 mode by default */ - outb(0, brd->vector + 4); - outb(0, brd->vector + 0x0c); - } - - for (i =3D 0; i < brd->nports; i++) { - info =3D &brd->ports[i]; - if (is_mu860) { - if (i < 4) - info->opmode_ioaddr =3D brd->vector + 4; - else - info->opmode_ioaddr =3D brd->vector + 0x0c; - } - tty_port_init(&info->port); - info->port.ops =3D &mxser_port_ops; - info->board =3D brd; - - /* Enhance mode enabled here */ - if (brd->must_hwid !=3D MOXA_OTHER_UART) - mxser_must_set_enhance_mode(info->ioaddr, true); - - info->type =3D PORT_16550A; - - mxser_process_txrx_fifo(info); - - spin_lock_init(&info->slock); - - /* before set INT ISR, disable all int */ - outb(inb(info->ioaddr + UART_IER) & 0xf0, - info->ioaddr + UART_IER); - } -} - -static int mxser_probe(struct pci_dev *pdev, - const struct pci_device_id *ent) -{ - struct mxser_board *brd; - unsigned int i, base; - unsigned long ioaddress; - unsigned short nports =3D MXSER_NPORTS(ent->driver_data); - struct device *tty_dev; - int retval =3D -EINVAL; - - i =3D find_first_zero_bit(mxser_boards, MXSER_BOARDS); - if (i >=3D MXSER_BOARDS) { - dev_err(&pdev->dev, "too many boards found (maximum %d), board " - "not configured\n", MXSER_BOARDS); - goto err; - } - - brd =3D devm_kzalloc(&pdev->dev, struct_size(brd, ports, nports), - GFP_KERNEL); - if (!brd) - goto err; - - brd->idx =3D i; - __set_bit(brd->idx, mxser_boards); - base =3D i * MXSER_PORTS_PER_BOARD; - - retval =3D pcim_enable_device(pdev); - if (retval) { - dev_err(&pdev->dev, "PCI enable failed\n"); - goto err_zero; - } - - /* io address */ - ioaddress =3D pci_resource_start(pdev, 2); - retval =3D pci_request_region(pdev, 2, "mxser(IO)"); - if (retval) - goto err_zero; - - brd->nports =3D nports; - for (i =3D 0; i < nports; i++) - brd->ports[i].ioaddr =3D ioaddress + 8 * i; - - /* vector */ - ioaddress =3D pci_resource_start(pdev, 3); - retval =3D pci_request_region(pdev, 3, "mxser(vector)"); - if (retval) - goto err_zero; - brd->vector =3D ioaddress; - - /* irq */ - brd->irq =3D pdev->irq; - - mxser_initbrd(brd, ent->driver_data & MXSER_HIGHBAUD); - - retval =3D devm_request_irq(&pdev->dev, brd->irq, mxser_interrupt, - IRQF_SHARED, "mxser", brd); - if (retval) { - dev_err(&pdev->dev, "request irq failed"); - goto err_relbrd; - } - - for (i =3D 0; i < nports; i++) { - tty_dev =3D tty_port_register_device(&brd->ports[i].port, - mxvar_sdriver, base + i, &pdev->dev); - if (IS_ERR(tty_dev)) { - retval =3D PTR_ERR(tty_dev); - for (; i > 0; i--) - tty_unregister_device(mxvar_sdriver, - base + i - 1); - goto err_relbrd; - } - } - - pci_set_drvdata(pdev, brd); - - return 0; -err_relbrd: - for (i =3D 0; i < nports; i++) - tty_port_destroy(&brd->ports[i].port); -err_zero: - __clear_bit(brd->idx, mxser_boards); -err: - return retval; -} - -static void mxser_remove(struct pci_dev *pdev) -{ - struct mxser_board *brd =3D pci_get_drvdata(pdev); - unsigned int i, base =3D brd->idx * MXSER_PORTS_PER_BOARD; - - for (i =3D 0; i < brd->nports; i++) { - tty_unregister_device(mxvar_sdriver, base + i); - tty_port_destroy(&brd->ports[i].port); - } - - __clear_bit(brd->idx, mxser_boards); -} - -static struct pci_driver mxser_driver =3D { - .name =3D "mxser", - .id_table =3D mxser_pcibrds, - .probe =3D mxser_probe, - .remove =3D mxser_remove -}; - -static int __init mxser_module_init(void) -{ - int retval; - - mxvar_sdriver =3D tty_alloc_driver(MXSER_PORTS, TTY_DRIVER_REAL_RAW | - TTY_DRIVER_DYNAMIC_DEV); - if (IS_ERR(mxvar_sdriver)) - return PTR_ERR(mxvar_sdriver); - - /* Initialize the tty_driver structure */ - mxvar_sdriver->name =3D "ttyMI"; - mxvar_sdriver->major =3D ttymajor; - mxvar_sdriver->minor_start =3D 0; - mxvar_sdriver->type =3D TTY_DRIVER_TYPE_SERIAL; - mxvar_sdriver->subtype =3D SERIAL_TYPE_NORMAL; - mxvar_sdriver->init_termios =3D tty_std_termios; - mxvar_sdriver->init_termios.c_cflag =3D B9600|CS8|CREAD|HUPCL|CLOCAL; - tty_set_operations(mxvar_sdriver, &mxser_ops); - - retval =3D tty_register_driver(mxvar_sdriver); - if (retval) { - printk(KERN_ERR "Couldn't install MOXA Smartio/Industio family " - "tty driver !\n"); - goto err_put; - } - - retval =3D pci_register_driver(&mxser_driver); - if (retval) { - printk(KERN_ERR "mxser: can't register pci driver\n"); - goto err_unr; - } - - return 0; -err_unr: - tty_unregister_driver(mxvar_sdriver); -err_put: - tty_driver_kref_put(mxvar_sdriver); - return retval; -} - -static void __exit mxser_module_exit(void) -{ - pci_unregister_driver(&mxser_driver); - tty_unregister_driver(mxvar_sdriver); - tty_driver_kref_put(mxvar_sdriver); -} - -module_init(mxser_module_init); -module_exit(mxser_module_exit); diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c new file mode 100644 index 000000000000..fe899ff090c4 --- /dev/null +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * 8250_mxupci.c - Moxa UPCI multiport serial device driver + * + * Copyright (C) 2025 Moxa Inc. (support@moxa.com) + * Author: Crescent Hsieh + */ + +#include +#include +#include + +#include "8250.h" +#include "8250_pcilib.h" + +#define PCI_DEVICE_ID_MOXA_RC7000 0x0001 +#define PCI_DEVICE_ID_MOXA_CP102 0x1020 +#define PCI_DEVICE_ID_MOXA_CP102UL 0x1021 +#define PCI_DEVICE_ID_MOXA_CP102U 0x1022 +#define PCI_DEVICE_ID_MOXA_CP102UF 0x1023 +#define PCI_DEVICE_ID_MOXA_C104 0x1040 +#define PCI_DEVICE_ID_MOXA_CP104U 0x1041 +#define PCI_DEVICE_ID_MOXA_CP104JU 0x1042 +#define PCI_DEVICE_ID_MOXA_CP104EL 0x1043 +#define PCI_DEVICE_ID_MOXA_POS104UL 0x1044 +#define PCI_DEVICE_ID_MOXA_CB108 0x1080 +#define PCI_DEVICE_ID_MOXA_CP112UL 0x1120 +#define PCI_DEVICE_ID_MOXA_CT114 0x1140 +#define PCI_DEVICE_ID_MOXA_CP114 0x1141 +#define PCI_DEVICE_ID_MOXA_CB114 0x1142 +#define PCI_DEVICE_ID_MOXA_CP114UL 0x1143 +#define PCI_DEVICE_ID_MOXA_CP118U 0x1180 +#define PCI_DEVICE_ID_MOXA_CP118EL 0x1181 +#define PCI_DEVICE_ID_MOXA_CP132 0x1320 +#define PCI_DEVICE_ID_MOXA_CP132U 0x1321 +#define PCI_DEVICE_ID_MOXA_CP134U 0x1340 +#define PCI_DEVICE_ID_MOXA_CB134I 0x1341 +#define PCI_DEVICE_ID_MOXA_CP138U 0x1380 +#define PCI_DEVICE_ID_MOXA_C168 0x1680 +#define PCI_DEVICE_ID_MOXA_CP168U 0x1681 +#define PCI_DEVICE_ID_MOXA_CP168EL 0x1682 + +#define MOXA_UART_BASE_BAUD 921600 +#define MOXA_UART_OFFSET 8 + +struct mxupci8250 { + struct pci_dev *pdev; + unsigned int num_ports; + int line[]; +}; + +static unsigned short mxupci8250_get_nports(unsigned short device) +{ + switch (device) { + case PCI_DEVICE_ID_MOXA_RC7000: + return 8; + } + + return FIELD_GET(0x00F0, device); +} + +static int mxupci8250_probe(struct pci_dev *pdev, const struct pci_device_= id *id) +{ + struct uart_8250_port up; + struct mxupci8250 *priv; + unsigned int i, num_ports; + int ret; + + ret =3D pcim_enable_device(pdev); + pci_save_state(pdev); + + if (ret) + return ret; + + num_ports =3D mxupci8250_get_nports(pdev->device); + + priv =3D devm_kzalloc(&pdev->dev, struct_size(priv, line, num_ports), GFP= _KERNEL); + + if (!priv) + return -ENOMEM; + + priv->num_ports =3D num_ports; + priv->pdev =3D pdev; + + memset(&up, 0, sizeof(up)); + + up.port.dev =3D &pdev->dev; + up.port.irq =3D pdev->irq; + up.port.uartclk =3D MOXA_UART_BASE_BAUD * 16; + up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; + + for (i =3D 0; i < num_ports; i++) { + if (serial8250_pci_setup_port(pdev, &up, FL_GET_BASE(FL_BASE2), i * MOXA= _UART_OFFSET, 0)) + break; + + dev_dbg(&pdev->dev, "Setup PCI port: port %lx, irq %d, type %d\n", + up.port.iobase, up.port.irq, up.port.iotype); + + priv->line[i] =3D serial8250_register_8250_port(&up); + + if (priv->line[i] < 0) { + dev_err(&pdev->dev, + "Couldn't register serial port %lx, irq %d, type %d, error %d\n", + up.port.iobase, up.port.irq, + up.port.iotype, priv->line[i]); + break; + } + } + pci_set_drvdata(pdev, priv); + + return 0; +} + +static void mxupci8250_remove(struct pci_dev *pdev) +{ + struct mxupci8250 *priv =3D pci_get_drvdata(pdev); + unsigned int i; + + for (i =3D 0; i < priv->num_ports; i++) + serial8250_unregister_port(priv->line[i]); +} + +static const struct pci_device_id mxupci8250_pci_ids[] =3D { + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_RC7000), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102UL), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102U), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102UF), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C104), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104U), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104JU), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104EL), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_POS104UL), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CB108), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP112UL), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CT114), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CB114), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114UL), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118U), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118EL), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132U), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134U), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CB134I), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP138U), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C168), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168U), }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168EL), }, + { } +}; + +static struct pci_driver mxupci8250_pci_driver =3D { + .name =3D "8250_mxupci", + .id_table =3D mxupci8250_pci_ids, + .probe =3D mxupci8250_probe, + .remove =3D mxupci8250_remove, +}; + +module_pci_driver(mxupci8250_pci_driver); +MODULE_AUTHOR("Moxa Inc."); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Moxa UPCI Multiport Serial Device Driver"); +MODULE_DEVICE_TABLE(pci, mxupci8250_pci_ids); +MODULE_IMPORT_NS("SERIAL_8250_PCI"); diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kcon= fig index 55d26d16df9b..e8b2878f8ab0 100644 --- a/drivers/tty/serial/8250/Kconfig +++ b/drivers/tty/serial/8250/Kconfig @@ -157,6 +157,17 @@ config SERIAL_8250_EXAR 422x PCIe serial cards that are not covered by the more generic SERIAL_8250_PCI option. =20 +config SERIAL_8250_MOXA_UPCI + tristate "8250/16550 Moxa UPCI device support" + depends on SERIAL_8250 && PCI + select SERIAL_8250_PCILIB + default SERIAL_8250 + help + Say Y here if you have a Moxa UPCI serial card. + + To compile this driver as a module, choose M here: the + module will be called 8250_mxupci. + config SERIAL_8250_HP300 tristate depends on SERIAL_8250 && HP300 diff --git a/drivers/tty/serial/8250/Makefile b/drivers/tty/serial/8250/Mak= efile index 1516de629b61..da9d35911bd5 100644 --- a/drivers/tty/serial/8250/Makefile +++ b/drivers/tty/serial/8250/Makefile @@ -39,6 +39,7 @@ obj-$(CONFIG_SERIAL_8250_LPC18XX) +=3D 8250_lpc18xx.o obj-$(CONFIG_SERIAL_8250_LPSS) +=3D 8250_lpss.o obj-$(CONFIG_SERIAL_8250_MEN_MCB) +=3D 8250_men_mcb.o obj-$(CONFIG_SERIAL_8250_MID) +=3D 8250_mid.o +obj-$(CONFIG_SERIAL_8250_MOXA_UPCI) +=3D 8250_mxupci.o obj-$(CONFIG_SERIAL_8250_MT6577) +=3D 8250_mtk.o obj-$(CONFIG_SERIAL_OF_PLATFORM) +=3D 8250_of.o obj-$(CONFIG_SERIAL_8250_OMAP) +=3D 8250_omap.o --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022136.outbound.protection.outlook.com [52.101.126.136]) (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 C6AFD2741C9; Sun, 30 Nov 2025 10:43:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.136 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499409; cv=fail; b=LLf2HbsazbDv4Hq1QLEPSZCYt24+o4r7R4kc2JAoXLb6Cj6bd8FkI/i70n7VQIzwbD749m65pVHgq1NilV8hhW7nvNFTiXMihNueBc+QRP5FwIdOqhBIEzc8EmWjfC4d37PPQppjbX/M3/w2USbxGzHTvqq5UdUO6fRtlYaM91M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499409; c=relaxed/simple; bh=lrA9q8DsuGQUdyNJPxqyh34LpcvGHl4HYCDTtj3qv8E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=laCWw62odzqHlsuz1bg2QxiMwGRN5ac8+tPgmuyBcXIjYfK/+4Ip75j573JnW1s0ljg/FeJL45gKyotSAsFJEOxNKP0eiFcNarDJn3TRvl7EmutGNiAQ7o0czDKOgs7Iv8w8g6vfRMrW5mVlWE9VJDQaKU3M/bZdTS8N8mXpJfQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=g8aJUBq7; arc=fail smtp.client-ip=52.101.126.136 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="g8aJUBq7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ag6CE14Q6JAKGfCvT0gBva4aDfMP5X6PkVHeNc4dKeST/t5NMytXKYoQEnWeax+aj2fHIZfM0Qh4uxYpEhGMhVR9cvJZEt/H4qP/mC8hxSxNbSPJJpYBDhJnAiVpsfcZ+6mD2LEwE9egygudJ4LbT+HfqDKMI7t4wccMixogoc09fM2j6VCXKwLY1w0xYCYruoStSwgWb5uvSTUpS4tyXRsm2N6n1NWVK6hOrVGaZOVTPgkqzRBqbHkWcRnOimQBQwOShV3yBWmdhxTXnLVwNnf0HGd+1zyJgvzG+5M3vnSjhRkBRiWywQJy9o1swrOXNA9+OwQZPFLHkrmoJvgQxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=RcW2HZ1Ge7CD9B2uOTFbznE3CQYjogI20/18E3lY1R4=; b=AOOB7FBNW6qeam/p6wV3Ph7MYcB9ZvJ+sJ46FkTnv12VcPp6GVfYjzm51l4xKj0WaoS3rVURT9z9rmsAeqjWKkqosYLUOb0aqBxvRRmJSgjw3C1X0g7Rpi0CUMqg1AcuKRF7C6d5UocmZ890/rJPOEsPwX721Xc3IwffjHvOXtRD26i7JCSG22dI9J0H+h24CNppjbzdQ8PNlQ8V3a7tfLYTw2Yj2YXepVJeO4IxfuTeDdR4dOjT05KzrvKdkHJDxPaazAe8NzxBCXjUKVGz518ejUkdEsqNq/ptWkuNT/X1JLmRGJxWumaruLRlrE31L1Wn29PyA1hhizVNQOr5IQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RcW2HZ1Ge7CD9B2uOTFbznE3CQYjogI20/18E3lY1R4=; b=g8aJUBq7wSrPeJ4Aqe2bTo9JBmFrhde9j8MSTheBqVBB0MDzbtTun5HEJ5K/lMh27Mkiwf8kmhoTtvaNWcsbI/zoRs/T4ChKN1OVcGqFs8V0g9dEp/cKLs4rz2TfSccl6wksgrC9SbKAyl90RJQ54hnJ/fpNvVmNxhTtOQtNorg= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:43:24 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:43:24 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 02/31] serial: 8250: add MU860 UART configuration Date: Sun, 30 Nov 2025 18:41:53 +0800 Message-ID: <20251130104222.63077-3-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 1e956c1b-a0eb-47b0-7226-08de2ffd4981 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?hIG/z6LsyHNLX4T2XRZGE/z7ULZUgNMFIJb8bgrdLrYB3WFjt0fnRaMuLtMJ?= =?us-ascii?Q?Rwd+SJLx0R+8GXg6QRJdIeDvLEbgIjzbXmGmfaJ+Y0l1x2u4wreRZAqzzJh6?= =?us-ascii?Q?mAJmLVdmvxOdCsEL9ba4CdLm0GN1/S2wO6vgPy4mTsoWT04JhcLLI1sRL5eR?= =?us-ascii?Q?CqaVOVEnfLCztPtq3eoHoNHU/BD45PaBzGI9O7bD1fWc+hjuVHMvYv/Ehsm9?= =?us-ascii?Q?G/xXL9zYRCshAcLIlfPGVNmXWtYHQL0V/aGP5pKoakDHmXPMaknA1UFcaB3X?= =?us-ascii?Q?7hOx7WIPDcNrt1O3ZOSAgs9RWw3yDVuFEi666/F1UCKoZvHCkVe2qWw/etKT?= =?us-ascii?Q?55CQuOwgxKQqX0UwqpEf3EZfDc+TH+Y47qUA4b1ZGj5bA5XDq5FlNTFeIHX0?= =?us-ascii?Q?1IujlHnRvfkOOd09tCudBwd3w9uKOShZzmhBfqvRCXSlt1q6iglwwT1z6KwV?= =?us-ascii?Q?eV1Wydhzy7JCP/GtGmupLyo5FVwfxd/yC3NQJ7bjWuDqUoCzHpUrPhZeS6N2?= =?us-ascii?Q?gkNFRFKHcTFl+yNvKyN4Clvp57itnXnsS8w8LQVfeWRDjXeQsLDrhoUIVzjo?= =?us-ascii?Q?3ihE/CNCNpSPTHuhXJ/NyQ0WOXRgNTdTbyp0WlW45ESSxZwdRzYcpXJQp3gV?= =?us-ascii?Q?TU8ZDgVVzTanWvl1dUoYDw3NZoLNF3nQGp40tdw30ZW/judVEoixNijGT9dz?= =?us-ascii?Q?otf+tmi/X/Ap8CxClyoAsxWnvG+a5mSD0wW31KyCFFHuo2Uv0acDBlQ69lTM?= =?us-ascii?Q?XcO0FEMGcuphr8XcU2H/Jp06r0kKcESp5fkm9HxsuZTOTcB1eG0spXtdS9hy?= =?us-ascii?Q?IdJTvotrroVnReZeo65odyjvdOkeK/zDAS2Ng7k6/ihIsnC+wb++QiJ5kKKg?= =?us-ascii?Q?CC+Ofkf+I6GW6mnE2030rwEyh/SCC3NBl+k9kgpX18aJlICY6CF0x3X1e1Xf?= =?us-ascii?Q?pKrwjxMM73Y6g3k2/cpnnzbyJsAWl4KLPoGj7PYw41fly9Rs3V67xJt2tudf?= =?us-ascii?Q?yXC7RZnWxYmIMwJeVolP4L8re2yMCfH137BRrKKteLfiUq37r2sIx78U/n5V?= =?us-ascii?Q?2iYozIIOQR6pAbU/bpzaC3kae+7y14E2VOApam6F1UvzabWL17LLdOrVrTiB?= =?us-ascii?Q?xkNgPqFt/tk3ShXLH9KVO5BPswtd2nJlZFVCdBPEwmQGc+xicet9mHAXk8gI?= =?us-ascii?Q?7h6Bsqyze++bCLb7Li7UBp4cXU1atQNDOtB6pOumlx1GnypRzLMnJlCkvMVW?= =?us-ascii?Q?GvgijzvCE5nKX85jle0rtIPiL8iUv3V1zk5xkFaoznC20vSPul8lq6R9nSI/?= =?us-ascii?Q?xXzH4H0ZSZ/TBkKklx8yesP7M/NPqLxL9D+UWu6pEAatPJLOzh0SJDm+PcyR?= =?us-ascii?Q?1e0+G6Btx7gyt7V1QxACOqKg6oIuKCBc0ADG+fJoZpEpPaVHF9osXWrFiCzO?= =?us-ascii?Q?OAChostesYkPfn+Rkk7SDFD+qPKwIw6/95XNJ72e4acRKG9gi654bQBWr2Gv?= =?us-ascii?Q?rkZCvACl9ok9J23tMblcOAqjJraunG+79Ons?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?SF1denkwukGKrnXCL6gpYOK5lXchr2Z7yJITwCtBZG4TkwRptYf9RX2dnvKS?= =?us-ascii?Q?nY5G1YJbcGyvz2UYoLoueRM5EezkEsDep3q/eQxn1mTq8DpKsb71REgs0+DB?= =?us-ascii?Q?NvM5TkNUH57QavunTJSPlMrZilGqCMHVzAerKMYna9AqSBt5pDXozyf7DCr5?= =?us-ascii?Q?QBo++zJl5B80G3aLlbAvWLIJXEeOuhPPhIg8Td1WS1zXvnMKc8RsRmDpkH/h?= =?us-ascii?Q?EasdH0z5MZofSJBH5Y4SZ2ySnFLGDW43NWtr53sAH6kRsa+im9MATZApi8KO?= =?us-ascii?Q?yRGNHD9AZE/zZwDmiu9YK+gqB/5Ozs2Kcrxd33JwOCHMeKjo9zqbgrO8pTap?= =?us-ascii?Q?a+Xl1rpMbLPJxbTBV5h3NPUYyeH/Z/gAMcEQYN2vabHA1l1v8N5ZxlyiIdMN?= =?us-ascii?Q?CgBQyIcMBy1g3SSn61W01LhLNMVBXjfAgzKfsGpSt294D6pbr5SFNy58GyiL?= =?us-ascii?Q?2u5c8AK+ibMwe/0p7pzzdQ5nIpCkVwFtflLkC4sCyHITFE6qRUqFbt3FclWs?= =?us-ascii?Q?7SnXWdjmg11yLeNngu9hjBz0QCbATPLmieMpsIF/rIydhGTGprsBNF75yAJU?= =?us-ascii?Q?aAuYQkN3Lp1FUzD5Uy9fp7Ujq6XUUK2SLQFV6PgDoy3qXcZXbiPFD7P3UVc1?= =?us-ascii?Q?3op3pl0t22U+ahnDqiFYJuxdp1NOamotC1HIIMERtXxuY5SWtyUJDszwj9KI?= =?us-ascii?Q?fGzZr0P4tOEnnp6wjm/8u17IZavrxmCGtck8A9FMIsWEIVlfRW8vUfs9BcK/?= =?us-ascii?Q?9q5z+TuzGkJGgZ/SFpCocqSjJ61IiNQf3Zq2VjXJEfEvo6ujX+BKbeL2RSR7?= =?us-ascii?Q?W5aaxmuFN4apgbM2TcDh6W88nYK84doFswWwGJIKJL2V5lsEO/5lkBzymgv5?= =?us-ascii?Q?kDMhA0LMr6Wzdc9WNbnvk4K0rKLB3QlJPZwePoCurCJHMYYEHLubG5CUpXob?= =?us-ascii?Q?PtsyyN8n0UtgW1mTYVQ+JISwTZSQONDJNaFPvjJ3Q4XLIV0jH5Ko8QLCkqF/?= =?us-ascii?Q?XsyFwl/th5CEvMhkgcgwQvAnxf2n6HMC+ccoO1PmjWKPEC2GDNmbbzY4CSQy?= =?us-ascii?Q?FEYcFLgmN19eHZCaTYeqKVvyx2QRqpWow5x5PZ1s1MIsB3Ija6QhGhKi6lIC?= =?us-ascii?Q?dnSgpyG6+4Xz3VthWNE4RiAeocvEQ3DoPtfO9xmd5X6MTQqTPQihOqboAu6/?= =?us-ascii?Q?MD+V1Jq47NrYQbhte52hSu9OzDUTu1xAEly3zKA9g8nkTtUWyLOFadisbzWt?= =?us-ascii?Q?oaK/HviBXThqdQ7L4p73lzKpwQCicsdkc84leVCnqvwQuPTjXWS3uuPFBLmc?= =?us-ascii?Q?C6/7b/feEH9CHPxIGgIUCpT2v2PTikXZykxPvjwDzQCthrF9kLDtJ7SpVNGl?= =?us-ascii?Q?WZRQ2ICMP/U5qXQ/Bf9vj6daViBcPgYczVRW3EtqPPyk9+g8VgkOI/ntCD2Y?= =?us-ascii?Q?YMx1NnUs1Pse5H4C3wxWqLyEV7i7x86fFAL/P/mB8wmvKgQHD/SQCXm5u+Eu?= =?us-ascii?Q?V8XRhFFOz+9ce5R3enfCLV/dS4JfdRND2LG8nBet8tnG/AY55tOfpn8d/Dov?= =?us-ascii?Q?1i6xJ69rXilJknWrmwaVwUbyczuED7s58psW+C0+2C1QRIHVuJCVzgoNthQu?= =?us-ascii?Q?pw=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1e956c1b-a0eb-47b0-7226-08de2ffd4981 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:43:24.0795 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: qh5S2XkDxQJEqozsB36SRh0fWt79O2Te9/Po/5QgAN+ZDLlXEIydGNXF8cGnU4pDKIPYBrVpm45M1s6QfWTx23vcUz+Qvzg3UCUlSzxWfPQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" The MU860 UART does not fully conform to PORT_16650V2 or any other standard UART configuration. This patch introduces a new UART type, PORT_MU860, to accurately reflect the hardware characteristics of MU860-based devices. The new configuration is applied to Moxa UPCI serial boards to ensure correct initialization and operation. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 3 ++- drivers/tty/serial/8250/8250_port.c | 8 ++++++++ include/uapi/linux/serial_core.h | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index fe899ff090c4..d7a4b838ec1f 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -87,7 +87,8 @@ static int mxupci8250_probe(struct pci_dev *pdev, const s= truct pci_device_id *id up.port.dev =3D &pdev->dev; up.port.irq =3D pdev->irq; up.port.uartclk =3D MOXA_UART_BASE_BAUD * 16; - up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; + up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ | UPF= _FIXED_TYPE; + up.port.type =3D PORT_MU860; =20 for (i =3D 0; i < num_ports; i++) { if (serial8250_pci_setup_port(pdev, &up, FL_GET_BASE(FL_BASE2), i * MOXA= _UART_OFFSET, 0)) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 649e74e9b52f..7d022315b3aa 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -319,6 +319,14 @@ static const struct serial8250_config uart_config[] = =3D { .rxtrig_bytes =3D {1, 8, 16, 30}, .flags =3D UART_CAP_FIFO | UART_CAP_AFE, }, + [PORT_MU860] =3D { + .name =3D "Moxa MU860 UART", + .fifo_size =3D 128, + .tx_loadsz =3D 128, + .fcr =3D UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00, + .rxtrig_bytes =3D {1, 4, 8, 14}, + .flags =3D UART_CAP_FIFO, + }, }; =20 /* Uart divisor latch read */ diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_c= ore.h index 9c007a106330..49c2fcb2e24c 100644 --- a/include/uapi/linux/serial_core.h +++ b/include/uapi/linux/serial_core.h @@ -100,6 +100,9 @@ /* TXX9 type number */ #define PORT_TXX9 64 =20 +/* Moxa MU860 UART */ +#define PORT_MU860 65 + /*Digi jsm */ #define PORT_JSM 69 =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from SEYPR02CU001.outbound.protection.outlook.com (mail-koreacentralazon11023100.outbound.protection.outlook.com [40.107.44.100]) (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 142C427AC48; Sun, 30 Nov 2025 10:43:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.44.100 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499414; cv=fail; b=KLiM+bP+1XEtx9QQU9r23g7ihYY4SCApmK/73ItyXaBIrvnxxZoJ3QpJtkuo9xjoithyJLRj4lPQmLsUFfxVU41ZIMQCwot8wUV9cympcSIKegj0HTGu05t7PtCen4T4iJF9J4bPt2Af4C+A+6PxZINhb9MYh+XB1MrF0q1HWuw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499414; c=relaxed/simple; bh=UhkRGzadmaKGC+n5Bf568U3fOyjhTokm83SfIsCkC+0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=XZ4zSTtFONQZr1F5W/dDYgYw7Fqn63xNMoDbUcai0q1Rtz2gBSm1idMLibLeh94KlnBXF6wevxrZjoIkQj0I8lNXCau+TujPrGz3HzHBWuGIDK2U2DOmB2IZsVn59txpYri1kkdTCZTJGN0iauUnFJTkNtYxs4Y+hP/Ql8d5SxA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=evzp9pz6; arc=fail smtp.client-ip=40.107.44.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="evzp9pz6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zS8apaVXsy1KxR8VwgJfCab/0eA7P0Fp9T+ZSqXF4FvgoLD/bDcrysSZnN0sU/lRUVpHYWfz0jgnIjIAUIqaXwKl1jc0cpeSqW4nz3kKHNnTBXtSC7OXBppLH1n2yDll2HLlJdkgc26kzcfD/wSgtoyzCuB9WbgIeRI8KB6qtKsAvsIzXasQOk4gsTmpKML5VIqT5uRy0YpshKTnD8duW4iFIQF6OnONuO/93mDmJ27jTiy9jXdGqlq1nZ/Fkl1s6+aAMSR759t2R/jc/YqMJhcXe3x/F7bhkd9g/SjugXplumO1o8L/4UMTy02PMTPujrpfvLnmS9PEZFylcrnFnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=VmY3pIp/xuValsoxf5x1qvgR9eIs5i8u1AanYHEZwQ0=; b=JdYPMwAphQxsWwKUjwVJE5IpGKbzbjVszBm5aXr/cF5//M6JgHj6DJ74Ia4PUU43+ncP3JOZ+ixJbV/NVxD1asXplByZ0u+FiU9nztSF58QgFXtXKrZsW1MoeqqY/HNA7BW7E5xj9Zg9SHQV/uvop2tBVT0MPAeQ4ljIk2jSuGCyNppEgQaZrY6WbfOb0PyCtZ6r9uH+3TdDcg9BD2KJo54lUv44xqa3rNcEXFbkCtqOMtJ+/DOf3H/PZSF+wJFCm0qkDuamiLc3zAqWvO+dCXATIP7hOyvbE+zZYKGgpJSQBu11KJTXxX5yg8VfIbyDesA+cUBlpx+ZwoOkB8GGgQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VmY3pIp/xuValsoxf5x1qvgR9eIs5i8u1AanYHEZwQ0=; b=evzp9pz6h3RkDDwt///9d2//N5fyxaYPQ5meeh/Y68MwH1VR9PhUQu2qYJtuFpzj3Hs8OKkudsvbfcIh9QEs6eSRNqCDm3HJQ6AH19dVOXQNR6fnG6S4VUcFLtTBNkbIneogOlqbMvzJNgi24H1JUahoC44UeuKJ8rn/o1iSN1M= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:43:29 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:43:29 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 03/31] serial: 8250_mxupci: enable enhanced mode and custom FIFO trigger levels Date: Sun, 30 Nov 2025 18:41:54 +0800 Message-ID: <20251130104222.63077-4-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 1cc1d547-22aa-4814-8290-08de2ffd4c9c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?fHGS5A9DagylaCkNPmHce79QmV2pREa+e7orFIMoUcgUh5ul8HuqPdKkmFac?= =?us-ascii?Q?Vj+rZ8LYhte7w9Y5qTrcJgu0jXVhalq8bLzlKBVOrriMzkcUOudlcYTlguTU?= =?us-ascii?Q?zXSMkIliHByO2mfFNAeaY6/e6mHFf2bW590ZM9vN7TUdl1BOk2oK4sYGYkRw?= =?us-ascii?Q?mQFwlHDDg+gpP0zSOsfafSqqktJXCdONsY/j8pmsS/Mhsx5oBYPA2S0sUiI2?= =?us-ascii?Q?zez6NwDJfMkuReH4+PIyRa+cdFQRxRtNGMng+kunGQOUCip49sEpMWBaan6R?= =?us-ascii?Q?nW2bnjZYxeEfcQFvFll4vfp7zY4LgbIdjYl4oSTeJNVSWXnuYxumVLb5kcbC?= =?us-ascii?Q?cfhnuXegeDceKhiMknqEXP8+4gUlSOC6Ar4GMkmBNnp/Q3u7kasnQ9t/DkLC?= =?us-ascii?Q?jahxAe5daOTdqsB6bQigujcvQB5tyYkzGrgBdchJ+nAwCYp7yQhlIcrdaiT0?= =?us-ascii?Q?y6QFD1SIljNubTXpXpyLVE4iOqHvgPbJIAU5osWHT8EZNFV2n8vNNvOO1vS7?= =?us-ascii?Q?HdAK2NeD7BztZbgeBotgI8Ym++vfcmB0FHOBQkTar3+kviRE9sbuxOiw1Wnp?= =?us-ascii?Q?edD6maGp6E7SbG4UAnO9N0Rqf1Jusi6zQauOAZPNa3+TayDHcGH7U9zSpYc7?= =?us-ascii?Q?7gclLHIF1X1hcp9oSfaj+vZkzsSDaY4hGY5VlrYOoFQ5FRAGQ0TEsM9ShkDq?= =?us-ascii?Q?yvK/jnbgHyksJXQkruKqK4h75yfP//tR9uSTiUrETSxY7SZUBGRX0A9SS1Bp?= =?us-ascii?Q?rLBP4W+vnlHiyK0kK6lgncxdNy47f2rtzfwkZkfGPv7HVKqRv6cOEXjvgmmt?= =?us-ascii?Q?MHXslB2csK+IKcZZZiY21WULRprHe6JR6BJvwgkRpfqJxqskCAWWMCqckhq3?= =?us-ascii?Q?RQKI4KiQ/ummJ+N+tGHSkcZqpSFEA8MTUnc7VGQyb51xlQZks2CzvAnLA+o3?= =?us-ascii?Q?4fBU9dy4WVGZXUsejSiX3fQSPBAXHUKycVElkKbUH2FtbHt/161JhsLplXrg?= =?us-ascii?Q?jWSEDeA8sPPxr9opFqWplDdiisVc5Q2jfZtHLen5x7pDznN4hFZj2eZ0pgu8?= =?us-ascii?Q?I/8QrCaRrLV6kqfUNuRwhzIYUboU1lOXnaMF0APMFkM28Yxegow259l7LSoI?= =?us-ascii?Q?dAd/QO9BkgIBOK6AfPFGppwLaMDesTMIzsZ0rDt6LRV1csPqhYbBxlzBnCnt?= =?us-ascii?Q?BCCfAcdExL3VZif9cFIXlqLmJ6lpKD3a1tQXr8od/i6Hi60znAjhqheW+KEh?= =?us-ascii?Q?nZk9Rr6cGXGfFRBH74OZ/ka5zivtK72TS2WzE8tXin/Hogz6jNRU96Y+yLiU?= =?us-ascii?Q?2wSFdChIK9ZxkBdhbNPMXY/DKaVBXrDDYN91ofQjj92auiQR68RBaCZLnSNg?= =?us-ascii?Q?18+qJeziiyOsUUq218y+FrZkz8YHOk/JLff1+8XN7mt1KMZsYM5xs/mCGt10?= =?us-ascii?Q?RzBdGMdNwvVorLOtNIqa0i9/W5vX6OKQwY8SvWl9V+fxuRlG0K5piK1oFz3X?= =?us-ascii?Q?/FcqYqwIq2l7AD4+Umt37W1ZvysiiT2uQAc5?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?+2dlxgktDqjfcz49QzB2cDE6DgiyoG9GTNmgUo8JtuYc53mLLs1S5+aP/uHs?= =?us-ascii?Q?sVj3nqwHqfFIYAIQAJCsQ+9+oefQKJO7JkB/ShwvBNhsRTohjfk/Hed9LcBp?= =?us-ascii?Q?NfFONUXxQmFWDfNo+9rake6J3xOv2MuDFSTVEJu4aCRn+80KfJCWC4H88vXi?= =?us-ascii?Q?j5VHQAJ6OkbGKMQ7ZuH6MTik5JuCWCdKBDO+a1K/AdqWi3OErFGRAaoOWulP?= =?us-ascii?Q?YyD61MQLXvSKl+5IDlZctHgHKzi0yYGtNdULVo08zr0Mv0jgOTQZhIfAnLbK?= =?us-ascii?Q?Ynv81IN6VN+JQkNzoU15n4jn/G871v9E9kcqxvq2Jmw3r6cGYnuM9lHScUP0?= =?us-ascii?Q?8gxvakyHow6QYz9IFR2WRZJGRQ/VlfwM5aDUShjoHZZy7YTvZLXuoQYJjtvc?= =?us-ascii?Q?jcOD6tXcqTd7IXqwiOLhSsUYHe82ZArvRfqjvfwQVmcR2zw0K32Hx0xy2apP?= =?us-ascii?Q?tbSmW0pKvDfzDZ7pAM/bv3LF/m7xevQXDWE+FLnDb53vBM+wTCpWNtESdj7G?= =?us-ascii?Q?ej0ZSTrFtg3QuRpslX+S6fF47QNoh80b1WDxOmemC9rG2nGtekJ6PfwTw35M?= =?us-ascii?Q?4X9jkNPgH0D7Y/opp+xHzz2sH7d6bx3+iBlfzH35TWrFLQHuu1FEA8kFWH6w?= =?us-ascii?Q?AvPq4CIxPUVDdjs8GYuvEETlsCL6jVLf2YJPKEA1+dtiyQ4172pAWgjBShiZ?= =?us-ascii?Q?0v6DBiPLx1iRWUkcQcSukDshiD16LF3WhYbmsegqDKGXk02XRRLdU+V/j4k7?= =?us-ascii?Q?U9FrTc10eId7bQUF+0bHF9Xh7iwLpMu8/aDio4qQpwSEynsHLEj7RqFu9zNq?= =?us-ascii?Q?oNjkopPqGTmNzVIrh1NiT5W5OEVihffTdlnMmh7Z0VLFVDIAuYfQ+h5Xadf2?= =?us-ascii?Q?eN8DeOAeQ+eUwH1WJImBUfT6z95YcJO63n3GGc9QYuJc9Al6B3SzDh+mb74J?= =?us-ascii?Q?8NDkqszgqdAcvRfq3E2rq3K7Pl+GcTpzYMwiRRza7Kx/tVam8RorIj2YkZf6?= =?us-ascii?Q?LUaGpwuO6AZgq39uwVsr8zXP7LgVHhL2OYg8wjcv2imZhFEFnbQVphuxtSiE?= =?us-ascii?Q?6ZGnhCzjti4YoywBjjbxrto4FfuIgcyK2AH2GGXiHR8aAlUZsuamhaMROorp?= =?us-ascii?Q?xpQPJvHkZOmhoO+qdYUe5+E7zB5ly7mvjJR3Si/4OTRNAnJsrgJOlxVldsRS?= =?us-ascii?Q?eIjEb7Illl1vwyZVDEIiLwcHOzfGZjOCduC8YL5Wj9F+6NpWXHqhFaO0Y2ii?= =?us-ascii?Q?5Abl6eaVK32vMS33j6qqkchFDsWIi/NM05KHmRQ+hhCBFVMqNIX2/1t5e5e+?= =?us-ascii?Q?/v5xxx93uiJMMdhVXB0tBMA8avuFEMrKWG5PB6lZ7AQKXT64IXbYmLuu0ooR?= =?us-ascii?Q?ZtsxVwxSg75ORWHsqv6ajIR9HbsFuX18X2qlKwjlPpu8prpw+n1cyW1bW80E?= =?us-ascii?Q?7mqQUHq7nWdwe2/bvQRgBg57OZIcGIGQPAkVzrJWq0W0+hO2HcmHslNlbZAU?= =?us-ascii?Q?x9HzGSOMu95+tL8NhKPl1Gm7qf/Cai6+s/biDCSxxB8na37GLhTOneEMw32v?= =?us-ascii?Q?1SzA2iWMGex7lftbXAU15LB69OvFoVTkoKxcl3OH3yR6hBT7xzYZW5I4J4Nx?= =?us-ascii?Q?Hw=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1cc1d547-22aa-4814-8290-08de2ffd4c9c X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:43:29.3076 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Le8CPprx6azqQnpPQf5ffyj9CXNDNOZS2w/x5cZt3iF0+1CS/+A5ppIF5IdBKAWK4yEeMigiRO7bY5f/lNnnKrceF+1uA3MjnDtyxsL7IOs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Add support for enabling enhanced mode and configuring custom FIFO trigger levels on Moxa UPCI serial boards. Enhanced mode is activated via EFR, which also provides access to three configuration pages selected through EFR[7:6]. These pages allow fine-tuning of advanced UART feature such as Rx/Tx interrupt trigger levels and flow control thresholds. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 65 +++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index d7a4b838ec1f..c4fa52de8962 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -43,6 +43,25 @@ #define MOXA_UART_BASE_BAUD 921600 #define MOXA_UART_OFFSET 8 =20 +/* Enhanced Function Register (EFR) */ +/* + * EFR[7:6] - Enhanced Register Page Select: + * 00b (0x00) =3D Software flow control characters + * 01b (0x40) =3D FIFO trigger level + * 10b (0x80) =3D Clock, ID, reset + * 11b (0xC0) =3D Alias of Page 2 (same behavior as 10b) + */ +#define MOXA_UART_EFR_PAGE_0 0x00 /* Software flow control characters */ +#define MOXA_UART_EFR_PAGE_1 0x40 /* FIFO trigger level */ +#define MOXA_UART_EFR_PAGE_2 0x80 /* Clock, ID, reset */ +#define MOXA_UART_EFR_PAGE_MASK GENMASK(7, 6) + +/* Enhanced Registers Page 1 */ +#define MOXA_UART_RBRTL 0x04 /* Flow Control Low Trigger Level */ +#define MOXA_UART_RBRTH 0x05 /* Flow Control High Trigger Level */ +#define MOXA_UART_RBRTI 0x06 /* Rx Interrupt Trigger Level */ +#define MOXA_UART_THRTL 0x07 /* Tx Interrupt Trigger Level */ + struct mxupci8250 { struct pci_dev *pdev; unsigned int num_ports; @@ -59,6 +78,49 @@ static unsigned short mxupci8250_get_nports(unsigned sho= rt device) return FIELD_GET(0x00F0, device); } =20 +static int mxupci8250_startup(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + int ret; + u8 efr; + + ret =3D serial8250_do_startup(port); + + serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); + + efr =3D serial_in(up, UART_EFR); + efr |=3D UART_EFR_ECB; + serial_out(up, UART_EFR, efr); + + efr &=3D ~MOXA_UART_EFR_PAGE_MASK; + efr |=3D MOXA_UART_EFR_PAGE_1; + serial_out(up, UART_EFR, efr); + + serial_out(up, MOXA_UART_THRTL, 0); + serial_out(up, MOXA_UART_RBRTI, 96); + serial_out(up, MOXA_UART_RBRTL, 32); + serial_out(up, MOXA_UART_RBRTH, 96); + + serial_out(up, UART_LCR, up->lcr); + + return ret; +} + +static void mxupci8250_shutdown(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + u8 efr; + + serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); + + efr =3D serial_in(up, UART_EFR); + serial_out(up, UART_EFR, efr & ~UART_EFR_ECB); + + serial_out(up, UART_LCR, up->lcr); + + serial8250_do_shutdown(port); +} + static int mxupci8250_probe(struct pci_dev *pdev, const struct pci_device_= id *id) { struct uart_8250_port up; @@ -90,6 +152,9 @@ static int mxupci8250_probe(struct pci_dev *pdev, const = struct pci_device_id *id up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ | UPF= _FIXED_TYPE; up.port.type =3D PORT_MU860; =20 + up.port.startup =3D mxupci8250_startup; + up.port.shutdown =3D mxupci8250_shutdown; + for (i =3D 0; i < num_ports; i++) { if (serial8250_pci_setup_port(pdev, &up, FL_GET_BASE(FL_BASE2), i * MOXA= _UART_OFFSET, 0)) break; --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022134.outbound.protection.outlook.com [40.107.75.134]) (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 27D2A27E054; Sun, 30 Nov 2025 10:43:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.134 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499421; cv=fail; b=H8OhhOaPuCIraP4A36iSmyGk3bzYfevKjVoh6Vp9fAun31YydCYqUVnOrbvr2YkO49At5Z6a3+mkUYRNV3RLmUwfmm+nBygwnN45Y6rb4cZPIliQI/nUGaH/a7G/1fBGP/GZmvAthI+nCfAlAIGypHAYkIuqRu1cVzhC2mC7TkI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499421; c=relaxed/simple; bh=4D6474JGIqUjWEVlP6NeuXJ8Ov7LPMUaZlwU31xlTuc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=XlT5xykxxrT1TeT86c9Pgl7f6ZWsjhKWSAADLvYuu40D9AC51URT2M9H+hF6pbRUcPJVy90mCkYjnlfqNGWoB3d/HOtWpztDFRSYxXGdyBnvJQ41AJQNOZqA4yBKccGoKeRJh0BAudpuZWMBvd9relY3fd8R3TWyY+xk9mA1eYw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=hrRPEi/7; arc=fail smtp.client-ip=40.107.75.134 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="hrRPEi/7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=uSLXPqScVeec8ahTfSAa1WciaRKsDKMwG5zfO1gSaP3+HLC4CWqEVqZnRlhdt+SBn7cpBwstLB5zgXxh+EROj2A7mtdZRciQ8hXqcnLPShu4SX3JnRJPCNhqJUSP8WNiQlFeGoSOG2L+gjoavd4RVSt5T+x8wByohozfMXFMsC2zdWySieeld401m4g0NwBHpb83QIMGDf2Jr2Gh+r15n0XAVaALUjg9JXllScrdU5fpOveW570degk2lxGTVuitDyDPyrwQAnFw2XXSogRDuLB8tk+iLWoLw8EWAGZBkWPpSkIVIEpqh+fc2Ynoz0Jt6aGv2R2+L1VbdHbp08htvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=H6SqGcKgOtTXeCrnUVmC4Zgfda0pLEZOYtMCW69BEts=; b=Xw+R/+tzaFMIuWKKratADBMyQwF6u1Btu7zr1oq8kgQ+0KLAs4+jNgIpD6zSQ6CriZiJ4uphCZ13kDxgp3x5EHBWauk/78QLvDQKJY1zO2B6CHoUKiHtSPuqNx3xkbcmxsA608bb3+Ng0yINuydbqP1scmy/T1qYLw5u2zIYDGgTua5d1BwCZpEjzqNJicbRYS77i4NQs3v0+i0NsBgJi5P12FTjDcMa8xgBSynQQK6id7Pxxbu0iePBUNiXdZlHr8xyesoJSquo3jEBna7ji9siJRc4FuNmqJWa/PCx9CobzieXnm81ewDmkVjHCkmk+USZ10rBzlFVH7zLIk/XcA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=H6SqGcKgOtTXeCrnUVmC4Zgfda0pLEZOYtMCW69BEts=; b=hrRPEi/7gcz1x4GNWIaeLNbSk1O3HpOITn+uTHr6putXkiPyoZvR7dXdKh5y6ro5TL2Uvo5VOJ/BJ9Yw8vaEDF9/fQip3KViHDbPxzRynV/l73h3FcnnWj7rnXnqBzfbtbei5a6bQjAbMjsnG6Uqsa+VPxzGnMmKzOKRZ9jkToM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:43:36 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:43:36 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 04/31] serial: 8250_mxupci: enable auto RTS/CTS flow control Date: Sun, 30 Nov 2025 18:41:55 +0800 Message-ID: <20251130104222.63077-5-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 6ab7b2e9-3b7a-481f-36f4-08de2ffd50ce X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?FN4eGu0kAgXm3MdlcC4ZFPkYiLgdqOJaS5zk9UL4YGDuys0nscqTLh4/thBV?= =?us-ascii?Q?qmr4GlZUsdH7/TpQzbCCkI/JMSh2VbAsuZiYC+9Sl9YqUnvZmwyFHSu9BElv?= =?us-ascii?Q?pbZxkixO3bMNsG+NcIoxGoyOhq/C9Vjo8kVdz/mSc/88qPKo8fmYgs0HpaVY?= =?us-ascii?Q?WLMdWXtEHZS7+9TI0Mm6ZHJxjlWBgKElc36j3d8P3EH/Iwk0RjPl68MduYz7?= =?us-ascii?Q?EvKyUk91Y61dErdPFH5Dn2enyfPNtL3NpxrKikoE9XYXiijKlxyyWcEhku6l?= =?us-ascii?Q?/aS9wARHn6oU5rAcdJeF03eQ+LDh19lBlFO+ycoSqgTH5HBaU8EgyM88O/H/?= =?us-ascii?Q?zUC3rptyVYcJVac1Wz29Rxh/+PMkYfOreErHsOxoa1pA+ZPQKb6DA17xy6p5?= =?us-ascii?Q?xuN9sdGmDQzEQiS66k8C3Sb6HfEjdXZhB65FBxPTf8w3cjoMTgUosijLbCZR?= =?us-ascii?Q?v129BvzVajVN2l1JrQZMyxbCUB3VETzgcbmE1PXW2e8UQ31viDzMovDoSzqw?= =?us-ascii?Q?LuXUyu9FKoDCjV1pGRl8RmQMbRq8CusA5d/BA1g2s/Nx5k9mR9L3kFgDHLPj?= =?us-ascii?Q?eqMi8xc52QlRD0c+w0Yq+WESoZzkVGXVKr6gCj6ovJz5D6NnNOhpu2MQVOqn?= =?us-ascii?Q?TBsN0I8We8sbAfE19qBjWR+QTmMdbs9YemGh0F9ddh39zLAEuf3FZnPgAUj2?= =?us-ascii?Q?EegvU3JpE4rSUMyqWo0LkKtZrjbMb9qeGEcpBd7nxs9zWIki3f5UkF5rutDt?= =?us-ascii?Q?qhB1Nv9tRWdlHSHqG0mGwuXbjF5BB2ZaTv1VYC0z70NNS4IVQoKBcchqGRDB?= =?us-ascii?Q?gPZvzDC0YWh0jcwfEKvrTeW6U9EDxSsYC0rGUMEEqzLT8Vy78nQHrp21hEXg?= =?us-ascii?Q?hDZQyxPgLWZEoczQVBD7ngeIGNRDaXFV/chCe7ZrHVwsUp6NlmZM/bDMSfKk?= =?us-ascii?Q?n388U8K820esataJAde/NVtSt/fdo+5I93NGIYnbEiwYSNoWrCU74gG9QAts?= =?us-ascii?Q?2tx9BLWTbqJUem5rgvxKqX39GsOxJrj+p+ALc7pdrgshDhOcaaeFuE01jdZ7?= =?us-ascii?Q?5wH3WM4KxLvbhUnd4+a9Adv+qlJtHvS7rUa79eV9M3PG/iBUR0hTouQUatX6?= =?us-ascii?Q?AolvRy9kAywY+2h+codaB86rfpO3o5dsl2MnbiYmv6x2BzkEEHzk5Rf4y46z?= =?us-ascii?Q?F+2qcLDd6JhnWKzYR9CSQEMJsu+71S6uikJ14B/FKbtBBBiW4z06p+sRX1Fn?= =?us-ascii?Q?t5hxBRhpjlO+DfMot6SUzqXbZaoGWk8CoWW4zeJABIcxmE4LGeB7FdinYRq5?= =?us-ascii?Q?r7gzR1Ra1YJqiIndpS5QxjwFp+a6y7+G5h0eyw9hAw1LfU7WWFYpAnfSxOAp?= =?us-ascii?Q?gW+xvS4U2pvVxLjAWAWsIOdxIS7/f1isfId5h0Icknmf6Zo0E8lbgaKNGoSA?= =?us-ascii?Q?BjGaNoIY+j5TqdJ48H1ufx2E4dXMTwmL77TruMEWiyX7gX47y0t8qiR0bEt5?= =?us-ascii?Q?DBGuXZ2uoycO3fh1oLz03Rr6/Y1ZYflmjC3L?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CgGlwWp8nv/l37SOibGcrlKn1xyF6WGfswb9Cw/kfw5AmZCVhAVN1gWU1nBn?= =?us-ascii?Q?VcwhUcT0YuHvwSZ5x5y33UxVeNzMbC2N9c2p0ojDCdX3t2dmJ9CheJR9CnAS?= =?us-ascii?Q?dl5XaNKQ4jSgExAJQ2NRbU+Q6vKqCQUbtnKcVOGUxxPj9oY3qCceBH8JTLRz?= =?us-ascii?Q?Qw9MQF9oZa8QGQz/GYfCwX7AOE6Pv2m5nmXAIHXN+9Uj3ZnNocDQ15WHCA+z?= =?us-ascii?Q?jAmXhtRNrodqW9DyLgvcrukpBfM9bYb8bLOcGv21RZIMCJ+htR1/f06GmCiJ?= =?us-ascii?Q?yVWTpg5l2uybWGeMvYUhg5x+FyM/9BPTLk7SdCEd3cnWefaf6JMGMgamlwBN?= =?us-ascii?Q?gNUD/x8T0kGh2gQHOqvPM56O2Pq+8R+kLZxanFtT+cQ22lbjY9J733/YA91o?= =?us-ascii?Q?/E4j8xB66+2qyfZ/MWmVKzHyAvcLUvO2Ay6cHMeR1dWoazqJxE+vIqdRvqzG?= =?us-ascii?Q?oRVZ1FAGP+7lWmmuzKXlTA9GlxTXSmmF4VU36rio+vfZbttoLgmoGMJzRUq5?= =?us-ascii?Q?Dk9Mk57v7ByGK2aUDitksvmyTRizHptch1EZ1+LxvQB2EnBBwf2OW8osDQUR?= =?us-ascii?Q?fI1rF3f8nJee6n31HkVagIRLAF2H0vmsdygAi3NBqJ5C4V5LcmF5mBGmoup6?= =?us-ascii?Q?EmRqN5l9EjQFmcPIMt+BEATkQky05BzLLpaE8SX/0xgzaGvBnWZjDYmK03WY?= =?us-ascii?Q?T7xIhLAyaMQ5d5Owgi5HvhNDRAzQpDYcfN1fMtrolvLoIrp9gi6iFleJz3pF?= =?us-ascii?Q?m4FpcdvuXZGw75TV8dQBYu9sBJJWl5d7ItcObvDYlYQowtXTaEHOEwB+oJzO?= =?us-ascii?Q?U/quC2pkgdyZx1srgxZHDiSXMdECHYuKIWEReIIF6M85tWqFeKiVyvO8ppeG?= =?us-ascii?Q?noxhQD4ZIJs9D/DiXKpBWdZvAXNVghIE3bDuYNsmOt04PLP6T26WJpKUr789?= =?us-ascii?Q?Fa8CzSx1dxBHGijgxpPxPEbWxzketHI2sA7buLgBC6wjvtH3UFIIHsr1Ez2o?= =?us-ascii?Q?TgGkymc8HMjWlt4pHGltqNp/T7adYu3yztpvCocWQrJFMWpEppDiMvU9dXNn?= =?us-ascii?Q?AATiWmgxyx5xi0GN9VyhxHmtHVzSStGaucBxvYbAfWKQdYTKI0ufYKSKQH/b?= =?us-ascii?Q?KWMIxDkVw5qwjhb3ONwco5H+GptWjnPpNHlDSTNCONiLejt5E2gYPvtov3L/?= =?us-ascii?Q?dEbhj4poLYGrI6jezgEr8X/91ONS0bH1qUpWadbkTlD2n3IEAACTq8iz9/mi?= =?us-ascii?Q?z7m9R+dprK4uLcadaK16p6lb2wtIUkUBKVnfzaXUgxrtepR7sYS/6+Yv2Uwk?= =?us-ascii?Q?BLbnbZ9QbbOmZ/nKi9ZxHhH2SUmameefsjixGvn9toyrUWwlRY/jeDWJs4ji?= =?us-ascii?Q?CwXtvHfKuQjcrjy4J/IPNFRFJg/D7ZjJSunN0NT/5T+jEbIUxpEAMFqmCydo?= =?us-ascii?Q?uW/t87qtUkmL41RJ4Hn25SLUJ9mm/KlHiMtayQ0gi31HiMqIgezBnnWGILaV?= =?us-ascii?Q?i6A2YfqG/iBafIfPfsfi7U/sPIUfsjMHocoMVLxJ6/9FVhmpA0dQLpuZ4uUF?= =?us-ascii?Q?meNqcgrO+2ldWtgn2uN18zFjUOL6GHGidfGRt00A4T6rBuaeK/OKdouvm2wn?= =?us-ascii?Q?Zw=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6ab7b2e9-3b7a-481f-36f4-08de2ffd50ce X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:43:36.3055 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 2utK8bS5qaBp1IHBs6aX/+aH/gBjG0g/le0IqPQZQqA6AbFFPFzb0EfJoGuDGWIS7qBvLjFXsUWOU5aZArO7r0zJn/HO0r7mFaFDoeSPAVA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Implement a custom set_termios() to configure RTS/CTS hardware flow control. When CRTSCTS is enabled in termios, the UART_MCR[5] AFE (Auto Flow Control Enable) bit is set to allow automatic RTS/CTS signaling. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index c4fa52de8962..54e50cd3f472 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -78,6 +78,26 @@ static unsigned short mxupci8250_get_nports(unsigned sho= rt device) return FIELD_GET(0x00F0, device); } =20 +static void mxupci8250_set_termios(struct uart_port *port, struct ktermios= *new, + const struct ktermios *old) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + struct tty_struct *tty =3D port->state->port.tty; + unsigned int cflag =3D tty->termios.c_cflag; + + serial8250_do_set_termios(port, new, old); + + up->port.status &=3D ~(UPSTAT_AUTORTS | UPSTAT_AUTOCTS); + + up->mcr &=3D ~UART_MCR_AFE; + + if (cflag & CRTSCTS) { + up->mcr |=3D (UART_MCR_AFE | UART_MCR_RTS); + up->port.status |=3D (UPSTAT_AUTORTS | UPSTAT_AUTOCTS); + } + serial_out(up, UART_MCR, up->mcr); +} + static int mxupci8250_startup(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); @@ -152,6 +172,7 @@ static int mxupci8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ | UPF= _FIXED_TYPE; up.port.type =3D PORT_MU860; =20 + up.port.set_termios =3D mxupci8250_set_termios; up.port.startup =3D mxupci8250_startup; up.port.shutdown =3D mxupci8250_shutdown; =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from SEYPR02CU001.outbound.protection.outlook.com (mail-koreacentralazon11023140.outbound.protection.outlook.com [40.107.44.140]) (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 E543527FD71; Sun, 30 Nov 2025 10:43:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.44.140 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499431; cv=fail; b=TFRVABFIltvjr2nyWtSxWveQbzOYEf2EPB1TLmXY1v6D7Bf6rpU24vh8d52IBRsuPafb2evWp6LUodJzBhLxnTeR/cgxBaOU2cZces4A+M3zXuDFp0LbfvTig+oq99+MqLqc0jk0KQb2jbP3+68Wbw3KVFIoqZi1FXCWqleDhnU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499431; c=relaxed/simple; bh=0pj6Gqx8jsg2mIiwllwPUXKIo/n56dJ/tmbwp26ojAw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=TdJKqWLkThGZxfsLs/YM2DqipYiffPCKWLxTJh6zEa4huShn09g1S97PUj+UqWC3kFXf0hcXgR8OsayijD/paGy1H8e4TG5SGQBbaJvRmAkYn/URorRKS+Ci8LvpbwpOc/3/dhKxPY3N9dWglsBb0ubEMsk9wDcKPUlTJAp86z0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=Ebj2Ecf3; arc=fail smtp.client-ip=40.107.44.140 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="Ebj2Ecf3" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=f/Ebs8dclSrAYqvqkFByTwjMkEF9ACUYtABk0MsM4GM8uWxLrrxoTKEfxdPNQPbceH0RNwzPymOs8V1efV5x+dPRB8k12Oz5rnrXb+D8jaWwnZazq2UdUs0HaPdIe5EycAZrsmFfVp/VupUkqKJYnM9J8WM/lDuagRtA525MfdRamviuzU4YtZy/I5Loa8KXJ3mdzGlt4zBCidPjdutkj2KzneCtREY8pgF4wBGn00oiZf/Yo0mm7VbKaJegvwAluD+b9DKyUEJB6Yt5WaXI99A6+r40Lv3bawIogUpNa6u9UZxLuwjklc0qG/bwfBhcnMcgpWL+icAwkcfsWJYkXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LuX5TKPkwJeTvWGOhCQaWSwcg9XhNZxSshE+7NGoQl0=; b=M2aW2z70wYpGixwKR9jwisNBOkECRY96DHhhXQR0T4gX4sOl7xmSvO2DgxitpzGFM1+aKxtaN61BgWCDf0aqeWyU/aYj1xavdHswtgJIoDlfWx7JnjRp+/eglRA6+tvl9KdQq7ZVALfMMRCgeDYrHHUQ3PgOBsryptuH7YPSFL32fgXw+kDlS9DUD3URaXNX+TUfn0pjRHBi6d5IuhRsYEz00VDPDyhQliURVsrEzPortIBJuDp+T6ofLNelZVSLiNvg3ikxi2f3XchfHgojX8S2wBhgTiqkQsnSh7kI9P/x8ZnDUlgQFo6nFHhY2tCLr6F+t5JSHWzn1yyJhryV+g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LuX5TKPkwJeTvWGOhCQaWSwcg9XhNZxSshE+7NGoQl0=; b=Ebj2Ecf3opPB5ZQdasmvph6Anf4GHRKM/aXHLjO2+ykhAV4ryoXGjLB8ow9690gTtyWow5nS2KG5wcEoHH1NNqU/jD4n2uYnPwjZMxlwlNt0u6odaSQR2nxoxyfcu3pFNbBp4Z8TH5WFNDhlG1zPB2tg8pyJo7pTCcE7uCRMGuE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:43:41 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:43:41 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 05/31] serial: 8250_mxupci: enable on-chip software flow control Date: Sun, 30 Nov 2025 18:41:56 +0800 Message-ID: <20251130104222.63077-6-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 863d99c6-1c5b-4385-a2e1-08de2ffd5415 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?f6OxEWS0cw/2OkFUtN179j6mU21+SllmtuhKFeU1lTm0mT2bR9Yn+X+ZYqeW?= =?us-ascii?Q?cKCixsjglj+ruQDwRXog9S6ZyP8FoSAEcgadW7xTVR7YQAEwIBbfclwry78b?= =?us-ascii?Q?RykwDB8erL5/HjZB3/eZ8+jPHzryfx0OAi6e0JFyNCT4l2PfJwSq90NRk3mk?= =?us-ascii?Q?CmiHHRjmuGh3iy4e9/cmg+SOeHj3s+UFJ7+NiguooHthxH2AYrKnXHQMHRxp?= =?us-ascii?Q?MyHRjuhoHCMvQ0UohF5IkVoVt812uZ1KV7fpIsiT4oFHH1rH14bem9XS9Muh?= =?us-ascii?Q?USzBmZujHEY+WwgcY2wio8w2P3GxZQTipH+KR2iM+1Sy+UvYLGwu7+pyfm+M?= =?us-ascii?Q?GaYpeGvNAGYWaWHUb9OSL9eMBejca8rIC67uEANNUygvR/XFyoOPuKOK0+TT?= =?us-ascii?Q?yD3moKbKXmbIpjTR/ATarKx0HLiQOgzGNh4PFxyTQci4/KOsoaYKA1KvQzCd?= =?us-ascii?Q?ZeVXgGKcGPl6VpWDrudadxVQB4gMuwFGvdAKXwVu7KBGgtotRebE/AJ2ssv7?= =?us-ascii?Q?VIA/z9WS+4tAd0VSVqa8jMuqOzXnCp/bt8lnasf6atOu/FVp6U5swIU33ya2?= =?us-ascii?Q?8cP/935wiNbYxGaZtc6wNsAs0kOOVknzccitsJkEziFTZAg/Jme2CltNxuWy?= =?us-ascii?Q?sLL9xdelQEtmv/pSyTHOhJnvPUrUvwT4ZljUOdb+ODadjEe0zy7qcO7jFu6g?= =?us-ascii?Q?rLSJ8vIj0ArBcI03jED3TFeu/Hf3qEmo6Rcl6cCzxaNoVyAXr2CwrPVoMwjQ?= =?us-ascii?Q?fTKBmv9ghdScHkwRJ76LNWtHhxq2pLmbkLGczEAHyV7TH2XkjhWSk+gRfpEk?= =?us-ascii?Q?0ksz7HgC3jiZ3J36+956etCw3g2WvJ2xCVU1BMXYAGdMBgRUMLjkFFouzNqa?= =?us-ascii?Q?XFQnfLzEZUmJRlmW93ZNvJRSfCAGcYVzzQmLQox7OqYYOpgjqtG2csdjTnAe?= =?us-ascii?Q?djuO1az+g+OAvXvdShGtRFBTCeqsRwE15ri9NEXQdVqZuUf0ES0uIJTTceb6?= =?us-ascii?Q?TX2AuyfMPWAKQCO1lQcoNw6fbr1p2RaEC8X5JLzhFkIjQpjikselNmm6ALK7?= =?us-ascii?Q?1G4lhqHLLBEmSP41eQk0iuv8KTHbDF17nzagnF2VXmHJ5kCjTk3KGdi0YoGW?= =?us-ascii?Q?cXkQG1yhFo4awzEv+tgOKP+lRPUWLYzxeOenFAhdi7qFXQwcFTDUcp9ciuu+?= =?us-ascii?Q?z+fifcxTm33carn0wssJfJCvOPz7EXrRsZ3s9H7EEs8f33ItueUW0gc0HvoN?= =?us-ascii?Q?dsOm/WtP5KOBJNQ0ltBS+KrPJTFBZuHhG13gz5CacjhIn+ZfX3P0jwoHl00y?= =?us-ascii?Q?P87SLDzDNf6TeA1WW9XcmcLrKbw+Heeptmxi1qouk9I07LmyYPh64ZYBwgx4?= =?us-ascii?Q?aIW1BXGsi4JV+EKBXdASM7igtbB7FHa9CZkMEGoefkjGjKPLai2AuXBd5B+p?= =?us-ascii?Q?A9bbPBtKSACo1gkXH01MTObuHhr6im7Dp4rbVEY2sD+dto/6FsobNRlcVNoU?= =?us-ascii?Q?G6lrC5n3hfk4ztrR6Kc7Mvpm+uhmWMTLrT4f?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?W98p0JShjHKoEUiECh3dMh6szGCWXRk72KH7B2EDJfGXzFCThd1XUC92qN6Z?= =?us-ascii?Q?fjaOjXEkThgPCqoWWs6Q+3H919o9uMs0EulqcbHujWadr3Csts/KRIdaqizh?= =?us-ascii?Q?LxowYwXCfV5FSB7hamGHiRESEp3QMUcV5xoZJrn2NOsPFqqS/AV8TSXSzNGV?= =?us-ascii?Q?l8pRAslzH7DhO0QbR6RP9sjIVerKhve6tbwFbHhUqwFenyT9moH+lpURxX+Y?= =?us-ascii?Q?Ov0h8BTGAqNSgxevMYoQDLnvM9FT14PPfkp2OVJ9EuRssTplfQEhcBx+xd3N?= =?us-ascii?Q?DwQOpHZI6OLCOjPsN+Be9U8Nle1TgW586BKa8NDZruGbQGy9AWmWWmyDPt1Z?= =?us-ascii?Q?UOnZ2V4qFoZAPRxUWVIovZ0Q/0mYBmIn10IJ3Jsxbqmw508gXEpoiHtpyG7k?= =?us-ascii?Q?KGTBnf3YRIIf8gP8TJt28p78cDaBeT2A9wgmPKv+nT2kFq8ucXuV4Hq4UE7L?= =?us-ascii?Q?FNrlLfsu0isqtOzE6kdHb6q5ABg1pNLLT4DjVyJca+484xZQCIdS01Cj0pOA?= =?us-ascii?Q?J8hw2eH9yv2Zs0F2xVseFEXM/LLT6QLFXA6d3vAmce+0LrEMj2OGK04LQJMj?= =?us-ascii?Q?wz7ZGi4iRd3+Ts6FxCqrKj0x27VsebnF2yEaKWLU/pS/+a65xSHKBgzG0g6n?= =?us-ascii?Q?ysPW1uWZwWoqatwBiCl+Wbe2So8KUuBdI5lg95jyEU8Wkf39n7k2uj3+pyAL?= =?us-ascii?Q?HyUTBhpAfItyzBOMOw1CaOzLEaD7TWAbpAf5tFibOz/ohKXnPxgHpcFlaC7w?= =?us-ascii?Q?tI83ld0sOIp7ot5jpAcrgXtNmhW1oRZX7V8JaTbC7p0UsGatHO46gvdJoYz4?= =?us-ascii?Q?YqCMIrFiqJQsUu4onxRrpXsgU7Lu6tbJkTB3Q8DWmXr1kTt7BlCvQwQ64tOF?= =?us-ascii?Q?NnwD1YQVC+JsvVxw2T6R5Cy+kd6lXMv0tQQ5FjFdFRPVCxIkScSNZIg5kIJR?= =?us-ascii?Q?fic5yeaZOem3RRcLdZerBioSlM5RLePT5rFZ9iHig1LsRF8dAtsHRsmIx8h+?= =?us-ascii?Q?AcWcvarn+mg00UalgMLXKFLlu1I211xvg2VaZPsWwY60qVsRN+Y6UkMORZg9?= =?us-ascii?Q?5kLOao1Vgj6Zbo5lCgFatfIGojF3Y6dUuBWaqKhs5Tnf3Z6ctMAbXzP0Z5Oa?= =?us-ascii?Q?WCw8+EZ/rQSYQsXwczNKNfSx0M7ldHl0XBbyCTm12ijX0k0Z8dJDfWWgrLhH?= =?us-ascii?Q?IHdkpRjEiUtI365O1aHpULiuGygybSVUEQyMUtsLQRCTTjhDVZsZ8jyZUim7?= =?us-ascii?Q?QOPsuoznkLGWEfbuCduQXo5VZahWHoZ6Ktl7E4mBmn6GBiwpDEGASn3wsS7Q?= =?us-ascii?Q?IBh2YC96Wp9t8g2HEjc1I5ns7BeixHD0z3/17B5Kf6m6KR/bPS1umFPkXH+j?= =?us-ascii?Q?mE43X3pM9DjpVhl7PjSr99dK69DguHY55ctlolVeOLexqAD9T0dP2TCINZXU?= =?us-ascii?Q?PSoPMnsREU7S56HQJQeK0gH5gFLcSmFq2X/qvbKGL0s57GmojNOSVHBrx7o6?= =?us-ascii?Q?QzEgKyhXm8i9/YBNBvZILoy0QZZ+xw+i1UAjGe9aqLZzzPdm8PVmPhwi1Ji/?= =?us-ascii?Q?ynPACYKUUGWIhb17qPbGkcukajagM4E05phx6QRIGRnJbf+EBxgPRkW0tZ4C?= =?us-ascii?Q?5g=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 863d99c6-1c5b-4385-a2e1-08de2ffd5415 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:43:41.7918 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: lqHnatlhmHGYeE7J8A1gS1gFL5knVMQ3JcGANCybDK/l55MCuMe8sHf/kIR6KrHJFkjzeFZUDIDlB1xNf/mK1fT4R8cuWo5rHR/TDh1G4rQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Extend set_termios() to support on-chip software flow control using the Enhanced Feature Register (EFR). When IXON/IXOFF is enabled in termios, EFR[3:0] is configured to enable in-band XON/XOFF flow control. Corresponding XON1/XOFF1 characters are written via EFR page 0. This patch also implements throttle() and unthrottle() to handle receive pause and resume based on software flow control. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 75 ++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index 54e50cd3f472..99bd3e504549 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -45,17 +45,37 @@ =20 /* Enhanced Function Register (EFR) */ /* + * EFR[1:0] - In-Band Receive Flow Control Mode (Compare XON/XOFF): + * 00b (0x00) =3D Disabled + * 01b (0x01) =3D Recognize XON2 & XOFF2 as XOFF character + * 10b (0x02) =3D Recognize XON1 & XOFF1 as XOFF character + * 11b (0x03) =3D Recognize XON1, XON2 & XOFF1, XOFF2 as XOFF character + * EFR[3:2] - In-Band Transmit Flow Control Mode (Insert XON/XOFF): + * 00b (0x00) =3D Disabled + * 01b (0x04) =3D Use XON2 & XOFF2 as XOFF character + * 10b (0x08) =3D Use XON1 & XOFF1 as XOFF character + * 11b (0x0C) =3D Use XON1, XON2 & XOFF1, XOFF2 as XOFF character * EFR[7:6] - Enhanced Register Page Select: * 00b (0x00) =3D Software flow control characters * 01b (0x40) =3D FIFO trigger level * 10b (0x80) =3D Clock, ID, reset * 11b (0xC0) =3D Alias of Page 2 (same behavior as 10b) */ +#define MOXA_UART_EFR_RX_FLOW 0x02 /* Recognize XON1 & XOFF1 as XOFF char= acter */ +#define MOXA_UART_EFR_TX_FLOW 0x08 /* Use XON1 & XOFF1 as XOFF character = */ #define MOXA_UART_EFR_PAGE_0 0x00 /* Software flow control characters */ #define MOXA_UART_EFR_PAGE_1 0x40 /* FIFO trigger level */ #define MOXA_UART_EFR_PAGE_2 0x80 /* Clock, ID, reset */ +#define MOXA_UART_EFR_RX_FLOW_MASK GENMASK(1, 0) +#define MOXA_UART_EFR_TX_FLOW_MASK GENMASK(3, 2) #define MOXA_UART_EFR_PAGE_MASK GENMASK(7, 6) =20 +/* Enhanced Registers Page 0 */ +#define MOXA_UART_XON1 0x04 +#define MOXA_UART_XON2 0x05 +#define MOXA_UART_XOFF1 0x06 +#define MOXA_UART_XOFF2 0x07 + /* Enhanced Registers Page 1 */ #define MOXA_UART_RBRTL 0x04 /* Flow Control Low Trigger Level */ #define MOXA_UART_RBRTH 0x05 /* Flow Control High Trigger Level */ @@ -84,10 +104,11 @@ static void mxupci8250_set_termios(struct uart_port *p= ort, struct ktermios *new, struct uart_8250_port *up =3D up_to_u8250p(port); struct tty_struct *tty =3D port->state->port.tty; unsigned int cflag =3D tty->termios.c_cflag; + u8 efr; =20 serial8250_do_set_termios(port, new, old); =20 - up->port.status &=3D ~(UPSTAT_AUTORTS | UPSTAT_AUTOCTS); + up->port.status &=3D ~(UPSTAT_AUTORTS | UPSTAT_AUTOCTS | UPSTAT_AUTOXOFF); =20 up->mcr &=3D ~UART_MCR_AFE; =20 @@ -96,6 +117,31 @@ static void mxupci8250_set_termios(struct uart_port *po= rt, struct ktermios *new, up->port.status |=3D (UPSTAT_AUTORTS | UPSTAT_AUTOCTS); } serial_out(up, UART_MCR, up->mcr); + + serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); + + efr =3D serial_in(up, UART_EFR); + efr &=3D ~MOXA_UART_EFR_PAGE_MASK; + efr |=3D MOXA_UART_EFR_PAGE_0; + serial_out(up, UART_EFR, efr); + + /* Set on-chip software flow control character */ + serial_out(up, MOXA_UART_XON1, START_CHAR(tty)); + serial_out(up, MOXA_UART_XON2, START_CHAR(tty)); + serial_out(up, MOXA_UART_XOFF1, STOP_CHAR(tty)); + serial_out(up, MOXA_UART_XOFF2, STOP_CHAR(tty)); + + efr &=3D ~(MOXA_UART_EFR_RX_FLOW_MASK | MOXA_UART_EFR_TX_FLOW_MASK); + + if (I_IXON(tty)) + efr |=3D MOXA_UART_EFR_RX_FLOW; + + if (I_IXOFF(tty)) { + efr |=3D MOXA_UART_EFR_TX_FLOW; + up->port.status |=3D UPSTAT_AUTOXOFF; + } + serial_out(up, UART_EFR, efr); + serial_out(up, UART_LCR, up->lcr); } =20 static int mxupci8250_startup(struct uart_port *port) @@ -141,6 +187,31 @@ static void mxupci8250_shutdown(struct uart_port *port) serial8250_do_shutdown(port); } =20 +static void mxupci8250_throttle(struct uart_port *port) +{ + unsigned long flags; + + uart_port_lock_irqsave(port, &flags); + + port->ops->stop_rx(port); + + uart_port_unlock_irqrestore(port, flags); +} + +static void mxupci8250_unthrottle(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + unsigned long flags; + + uart_port_lock_irqsave(port, &flags); + + up->ier |=3D UART_IER_RLSI | UART_IER_RDI; + port->read_status_mask |=3D UART_LSR_DR; + serial_out(up, UART_IER, up->ier); + + uart_port_unlock_irqrestore(port, flags); +} + static int mxupci8250_probe(struct pci_dev *pdev, const struct pci_device_= id *id) { struct uart_8250_port up; @@ -175,6 +246,8 @@ static int mxupci8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.set_termios =3D mxupci8250_set_termios; up.port.startup =3D mxupci8250_startup; up.port.shutdown =3D mxupci8250_shutdown; + up.port.throttle =3D mxupci8250_throttle; + up.port.unthrottle =3D mxupci8250_unthrottle; =20 for (i =3D 0; i < num_ports; i++) { if (serial8250_pci_setup_port(pdev, &up, FL_GET_BASE(FL_BASE2), i * MOXA= _UART_OFFSET, 0)) --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from SEYPR02CU001.outbound.protection.outlook.com (mail-koreacentralazon11023140.outbound.protection.outlook.com [40.107.44.140]) (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 9DAA027E05E; Sun, 30 Nov 2025 10:43:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.44.140 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499435; cv=fail; b=XXD2k5GS4poS+yXYPK1OnUdYu+iN5lUKTeu1zu7JGNV8jId2OXL1zvwsTT6NB0js/bbrBNL3hYAWOOmFDoSwyh5b/B6023pGiiN1K60P+dOv+mQSSzmik6+TR4mGI61tUFxIm5vT4ykEwxslKRP80OToEDsriOYY+/GYKFIifa4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499435; c=relaxed/simple; bh=/d3476j44XzBLTeH0VXiDioeLnxwf/vrYS2h4D/rVbA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=m0S8gG9hipp2TUehIdNyDDbK9MmZekuR4+FmqMilCzeMH2N2OCBrrZ9dWUC4KixUrm+VWlyfAUMOrnLjHWc0MU+y3XH6SqTAD6vanR6h94rDh5tmHGvD2dJ3Qfd/m4XkVgBqD2THQx/hASbXsIJGE252oKIaxMChWEI8R/bq4IY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=d07jtc35; arc=fail smtp.client-ip=40.107.44.140 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="d07jtc35" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=roeUVS7kl9Pv9PKo0NmqndxaE4FmI9TsiZBEEUToQSd71ENJ5AEVerJNbJfn589Nsr1yH2PGTYwGrmnNe+rB1+NZMf336OTbGYxjy77QFYAEwO4YmhDmxfB/cJ7ZRnk2F9+I/zR6hQZxXlC++EJqsh6lX9YXTre+RG0ydprugWPJvljJYwQUq73MyPM3O1F/HlGBy5Y/SfG3zYcJ0ppbx8JsldnCucpEeGQCxePMCBuKuGbT4K6UHAb9+Seu6dAumOwUFvwuHgXjl0JXLOmSkq5jjFPFQRpCCSLjrQNPpGW+wrT3sMuKKtF31mlwbwnaVqXkOCx6cL99WNpuuprZig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=R7NnCPTAF0MpDtIV9l6ZfdbTboRa8DfUMVlJCxL14+A=; b=VvN+sGzyY4ETsMUVVIJ9BwXIlZK+xfiUFLcQgpeNGeMFtlTQE3/BI51Z17InlbH9ansWbNUAuBcTI4ki4bq7CHEMWNM9VsL8hY0OUsWLv1tJRkRKQMMXQnkHhySJlWtJF0G2LG3FmRI7HhlI3QcZurmjkHPjA36TasD1sunrDcYWZTd0ukWCS2k/KBPkwkeTPaNQn1joNG3al7HyWuJqiup6nbZbzKVZ+hY7SFLfJwsLfAIh4IyOcGtrh1mUprq/hZv2mEh4Rdv9mDxnmWInCB2h9JQ4UC1sSV7EkiPP3Wr369QVFNBVFoziULhpwaA9aliDpdwC+Th662vHDxCTFQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=R7NnCPTAF0MpDtIV9l6ZfdbTboRa8DfUMVlJCxL14+A=; b=d07jtc352AnCWMbYmU7wcmZy0tasGf6AV5QbBkkD5oRRD57v1NjmypfPGNnMPQG/K25DM7jTRxB9JBvTpds6a0aZNGiGDLRpDZ6Hal8Ojd0LiUz+4JWmrq1ub+UvH9XuWT8qMGCeJT7FbNr7532bwPgY+gybQXvSc3gCiKxIiiY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:43:48 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:43:48 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 06/31] serial: 8250_mxupci: add custom handle_irq() Date: Sun, 30 Nov 2025 18:41:57 +0800 Message-ID: <20251130104222.63077-7-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 57e54e9b-d705-4607-1099-08de2ffd5823 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?hQcdgKEMe6sWcRoReM7L078WPrKnWX8hM+C+5tQoDu2osZ+nXlvYlMHH2BOe?= =?us-ascii?Q?G60fGE2ulos1gVT7UFm//JskU/8ExlQO9UOB4ku207YkEMwIV8oNXakHGY5p?= =?us-ascii?Q?Na4nigpbYlmdZFRfTAHLh0BAmD1I79Tq9CEOSXVqu9mHUKsXOZ5bxO7d05jK?= =?us-ascii?Q?W6wEJBhnS8flucO5MXOUV1aX3Ju/bq0fS/bSIZ2ZNpa3s59pKJ1/6uXOmyEX?= =?us-ascii?Q?XrFkmXKLaN4p9bny6bqN5m3laiRBrnES1j9EnGakB4GVn7q2KMIf1IOt43py?= =?us-ascii?Q?CECi/kMdeDvHUQNS+LytxxPzuzBrErvM96zelKIx1B51ecdfUs1lU8JUWV8Z?= =?us-ascii?Q?I2RSKWlng8tm10tbWFoh3+ssbR+kDspWWjCBjVazU6ASDbhpuevCkfqbicMy?= =?us-ascii?Q?dmX1GpD9wzj6qi/MzKo54bexnK6ojv3ATUx1mNJJGZgmz31Gkl+O5sc8WvHp?= =?us-ascii?Q?C2MEWxUJuU/GYq3uwBy7xIRcPdC9U09matwz1+MOQX7WltsieODi3uHIWVOV?= =?us-ascii?Q?nIqtFYq1XLIoHNmpNp/AfNINC9DPBT4lipE8pz/s4/fEq8LTsl2IPlqiYq5a?= =?us-ascii?Q?te25b96oJ7aCRqCctxwSIO4Bih0RbT1i0rYxd1SY+2Oou7lnxQouJeObj5wp?= =?us-ascii?Q?wEOz3O+XjYV0sVuOA4MTyhqV2cfuC6RRmzvC4voovMN8ADUsoa0prDHZsIlE?= =?us-ascii?Q?NKaXS169ps3dUWZ0OGGbeMXG8EVZy/UOHbWwYBMn/PrBbaPtM4E9EjUG1p1Q?= =?us-ascii?Q?VH6mUTVKaNjjiLEZIDJ/yXgJ/3e8m/FBLTLLdKib6IyuVjZkjIcC2pJ3703q?= =?us-ascii?Q?ZAE1HKTTcNPmr10j2O5IFB53H0vXUO06DSJlG7Vmlywey864zXyi5d306Kyq?= =?us-ascii?Q?+CcN9IIUIVYNoiu27I6IG8KQK/Y1o3oSWbOXoGdHdD71UYhYMqN7E9+zHl71?= =?us-ascii?Q?6ZRCcTRTs5H5o0yu7Pgk4+xSwoRAFlBeO094wz42qVdkUFAstedJwhU6+Hrl?= =?us-ascii?Q?AUxHdvNq+YWBOUKL3TXvJ77UDeuZa7c0Zlke51Tc//aUbHVLBd59sYX6yVHu?= =?us-ascii?Q?jOzq0ReU9sRJSVuKs8bcOJyIDzfB6dBrTCUL8O5ZJ7g07gyHDYgDbNNlayAF?= =?us-ascii?Q?4cVMn0q4897ebe0fni5B4z2B5ifns88fJtUysIi+q1nC3VIP9TwZX7P10K9F?= =?us-ascii?Q?ARhYECUte0ZAcvZc7rpwX7h4ZDNxORKMTG1pu0is7vfmi0VaIMXxqrOvZD5b?= =?us-ascii?Q?S6sh4DvLxx0K3z1t21g4CLBQEFHJxmTMzALvo7VZzmFjVIvugotoLPkFo839?= =?us-ascii?Q?cU44S/RkEWMA8f9JTmB30S5fWQVyUxWCNn/o2WhLxCCZY2h3WqIjJDqrXXNj?= =?us-ascii?Q?SlOxS3tmDvW3E+2wM6XMPG+N8wC6uss6cmA4rfUqVYEaM62VS3tE8Bu+tMTS?= =?us-ascii?Q?Yk8QTNeRxcIOAl1nHljNxDV3cGUkfuMbatD2yQELQWUBoGkLsziS2XnQ177t?= =?us-ascii?Q?Sn3bxTZbEIil8MaKGErVDLlDi4lTae2hDX3o?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?5nfLOxUzGsEXvpWy+X1nNvg+OP/tSBHUET8nPpg+jy9dX+UPehUeDpzmrV5/?= =?us-ascii?Q?BkxDV0h098Nf0dn2w/3l3JWOViQck47n4l2pO/7JTDC7arrwsk8nZkfrCweS?= =?us-ascii?Q?MLGblhokWuW7IZSABCb50qw5M5XM1BKeLv/mht7ygCR3ZAVBKPK/0xqd3H3k?= =?us-ascii?Q?E+4l15e/gSR2g960BCS+KEaJD9iAHIYjrQoxOBJUfKO5DRB2wCv3cn+5aVK/?= =?us-ascii?Q?mznZSpLiTZFccZclXpGJCKnqAYb2kWhEcC7B/v7PgMxjSTdUksjJR3sfr4ce?= =?us-ascii?Q?T/d86hgdwzPBzBO0ckFlVq0tZ+1rshSl2xQJmTm5rBs1qJyUOwvJR8mzeBqM?= =?us-ascii?Q?obllfQJIC9fPI7pljMCi8jcicb/Ymxy6te8mj+ai+D6nYXa/bg4BIl0I3dKJ?= =?us-ascii?Q?2HAdSPEjVlEXBHnDGW/5seMQRDPpw9zFVSucEl7G9rY5RJcF1Wok0o8wj2Fs?= =?us-ascii?Q?5INhZvao/izT+x7C0OQlV35R8xZWNA/I0fMX5OfbRd2K9WJeZ/73o83o+LI+?= =?us-ascii?Q?VG14UyY/6QJP2HP4bjaHpQmRnFCDEPBiobUyOndct3rDh3iBPZXSnS80ry8t?= =?us-ascii?Q?bJ8/Mv2AnsBKIQKHQ/Yuwu7kLP+HWGNEwV0oZwOzT8mG0/IP68GKZfaWlwYm?= =?us-ascii?Q?+TyQO/6kdEPIQXR33Valdf9/8p28qlizMBcZD5kfZSP2UnSpDNzalDE6AmrX?= =?us-ascii?Q?j2i+6Iuw+ARG8rD1+2Qk2sWcvLIwQJTw5XEsb9YJ4rzLMZxab5D63+jxZMSA?= =?us-ascii?Q?8salbkMGEgt0ijE+I/PZEM4lIJBc8RPxvp1RZYH0Lk3YQQbvoLArUF3FEIpC?= =?us-ascii?Q?vu2JY3qHxWyesxLpTB1af7SGh2UJE+fs8AEIBOBa8BuP8a+O5ZuchNa0JKEB?= =?us-ascii?Q?jNgubNy2jJAMKTkGSBfNnu/EU8HotPBWOxxfNtAvE5VrEHQQkEROKDp/wQxd?= =?us-ascii?Q?GgpCAREIlByJ8hzqZX4BBVn0vhOP6bq4JC/PXvoNiqk0+rGqbo9GGQSNpc4w?= =?us-ascii?Q?p9MQmgw7FT0CKQ6hJfM5cUlnN3n+W8pGSAAcyxeCiFMe1DtyF60ZgLUuwP99?= =?us-ascii?Q?8VSpefdX1dcE99iyaW2xsiPMIp1k3o3ETCyk19I5xHaTmtd9llX8XapTvbyU?= =?us-ascii?Q?8PrnVLUZCnzmrpobfocuoHQmGhy1HbOnNp6pR5rO3dTGDlJAfwxOWICFbkq3?= =?us-ascii?Q?qj5kJIq1hl5hzHdt6HgcyIV7ycpULgtbcsAuLc3P4Z+mLhHE1YA9j+uaYsaQ?= =?us-ascii?Q?aV07yUdKDabzkP3bqN4p2242unng+OpQV+Rg/ZFrNPRR02+oxsRrcXjJqN57?= =?us-ascii?Q?nfZ+e1K7t9yr6M5m3q3JhBAa00epETCl27J0S4jElloxWVVj+3AWPnT9037k?= =?us-ascii?Q?WtF9dIyOD1DhCEzXyyjbR+c4wekIdYjGoNR/xSWEM6Wa7iCWYicTxuxT49Og?= =?us-ascii?Q?4ujOQtm23xCv60ciigqD+nLZYa/uiUiJBUqfsImUvmX1TAaS+N11h/TeMlka?= =?us-ascii?Q?GVbWYj2W//kfij7GF8SoB7lMhnuhbJnJ3ljVET3XCV1IfYOG17Brs8uxTWeY?= =?us-ascii?Q?lIqpZRmWgfoeR3t0Fbdq0l20zwRQaWyUBlDFKcDf8XkDgnMheTl6hv8zotx2?= =?us-ascii?Q?KA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 57e54e9b-d705-4607-1099-08de2ffd5823 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:43:48.6103 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: fFM7mQC8SsGiVUG/bnJXU8MGGT511puvOmgiJ4sRaJ81m6IfgTxoywuGHYX+vVDoPJZF88ayvRDWHdke5tsixB9JyiCqgAd+jInb7xoqXK0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Add a custom handle_irq() for 8250_mxupci based on serial8250_handle_irq(), removing PM wakeup and DMA handling that are not needed. This prepares for future adjustments to RX and TX behavior specific to Moxa MU860 UART. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 36 +++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index 99bd3e504549..376c6d6135a3 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -212,6 +212,41 @@ static void mxupci8250_unthrottle(struct uart_port *po= rt) uart_port_unlock_irqrestore(port, flags); } =20 +static int mxupci8250_handle_irq(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + bool skip_rx =3D false; + unsigned long flags; + u16 lsr; + u8 iir; + + iir =3D serial_in(up, UART_IIR); + + if (iir & UART_IIR_NO_INT) + return 0; + + uart_port_lock_irqsave(port, &flags); + + lsr =3D serial_lsr_in(up); + + if (!(lsr & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS)) && + (port->status & (UPSTAT_AUTOCTS | UPSTAT_AUTORTS)) && + !(port->read_status_mask & UART_LSR_DR)) + skip_rx =3D true; + + if (lsr & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) + lsr =3D serial8250_rx_chars(up, lsr); + + serial8250_modem_status(up); + + if ((lsr & UART_LSR_THRE) && (up->ier & UART_IER_THRI)) + serial8250_tx_chars(up); + + uart_unlock_and_check_sysrq_irqrestore(port, flags); + + return 1; +} + static int mxupci8250_probe(struct pci_dev *pdev, const struct pci_device_= id *id) { struct uart_8250_port up; @@ -248,6 +283,7 @@ static int mxupci8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.shutdown =3D mxupci8250_shutdown; up.port.throttle =3D mxupci8250_throttle; up.port.unthrottle =3D mxupci8250_unthrottle; + up.port.handle_irq =3D mxupci8250_handle_irq; =20 for (i =3D 0; i < num_ports; i++) { if (serial8250_pci_setup_port(pdev, &up, FL_GET_BASE(FL_BASE2), i * MOXA= _UART_OFFSET, 0)) --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from SEYPR02CU001.outbound.protection.outlook.com (mail-koreacentralazon11023115.outbound.protection.outlook.com [40.107.44.115]) (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 DA642279907; Sun, 30 Nov 2025 10:43:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.44.115 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499442; cv=fail; b=SbHxCIFhRfNKb4K3eRktMiQ7Url37JZ5PW9rS+blxHiNohSKfleqNIUXMk8SSTCz+2UKLCPNfUNJqISlpLk4qiNj9zH29Czkez+EuZM50c3rljcuzVGLF41zAMh1WARkoZCvFGW7Gaka8IbG87ixVmvub4dEhThNuBXpSDNZQQM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499442; c=relaxed/simple; bh=bg8oXFYVCbg6rPyUYson1FAG5kw46dWNZC6x8iVIPV0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=AhVQTrKWrBKu5eAnVGCqRdbF9XFiEdVQjFITz6gek6wATVrsYKt/18qxjaBIaxjwtXwHnvXh26/H2b+MEghlPfA0HBJsWFunrbTGSTa9gBrU5oCthbnlSgvpQbqCXpjHwc5iIKvmrEhSzBx26u3X+KPYy2UnQ/kqzd1q8vMODHU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=Ch07YtFK; arc=fail smtp.client-ip=40.107.44.115 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="Ch07YtFK" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QPXdHKLN34UJ6Q7stPRBDOPveP/lxD5dqv0AVr4ASPgY1vLIEtDUpM7tgeX3e9135ofGhvfcoTBrlKsp/NSsx2akFeSDGtJjNZ5xfwP7nhUbW2i5Qfh1ElS601flULPdPy9jVQRrDr0QYKkPgT7W0FQZOE4BOE98BMG7KZiOlgLHkjGfMQ4oecdlsoCq980aLCWlTI90dtgfpBmhl+36glajB0AOaLCE/UrfKrI9wg/x97Gh1x+/1e5ZVH74tckBVKKHaRPEIseStHWuTBkOLK2HZeJnlVKWG7NeGj7C8alBE/g9hMFFzot6OkLvJyMBOttfpDp/VqkKic+g1MRxuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=d/P2OQ/sxqilOOPwRb9C82y2/Gu+3YyYplvALC/oxyQ=; b=BnsI6vlZsXRtoMIysWg92lmUzj3Nkn6/BG3NiWWW460FjeqzzqNrv/mMcP8SSlFreBHNwYLvj0E0WB08T5QG3CjwbrcteWb7O3C6gTkBF9+TcpWVp067o4SsmMtuoUm+hHFpyLuXZwtRZVSQbyffaEipGZDdpJXeV9G7AFkNn9Kl/W3+7hC8gpvDUlaHONqydmZH/33ycLwj8+ucHrTB0cJktyGigRplAeayJ2XbuH6s2qhHjVlQzBD9N16Z0M5tyc/zNP2vL3MbLOXpA/jXtDTWix340bYfr3wX0koEXkNFxkKmLBI8/SoaEC8ie9h6i5rj8CTD0UyNmFaqK77edg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=d/P2OQ/sxqilOOPwRb9C82y2/Gu+3YyYplvALC/oxyQ=; b=Ch07YtFKPIH38Dfe6iXssLMRBsxBBMMJagZAJvIh34HxNv7XoSIPdvoJo2ErbOoSjXlGOUGgRvHWr4JPRu5RtrWKXPgLxljgI4lToqzTC3UK5ZGmhF0wcI0tfnyN88gvPtnZ3RI1B1Z5djfoIivL65TxGwkoAn8TG6XAJj/uxDA= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:43:54 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:43:54 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 07/31] serial: 8250_mxupci: add GDL-based Rx routine for 8250_mxupci Date: Sun, 30 Nov 2025 18:41:58 +0800 Message-ID: <20251130104222.63077-8-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 95729ba1-c647-4125-82ae-08de2ffd5b87 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ioY2V/qw2OxGRRy4lo4+SB/1VwFGtEbPao7LgJjhTlzS2jaEaihYNiq1YzbQ?= =?us-ascii?Q?x3+lGBmkvWxvo60qILcf448ikeoek9rmKz2zXVjMvcnUL/DZ/uPh6raiEQor?= =?us-ascii?Q?/knS5/luR4OruJJAuQfcC9AHwrwJupyp0MjuL1ZEXeke8yFHIgviSc4rqzez?= =?us-ascii?Q?NDl5j0IphK+Dy1KbZVh0qZU2x/JY6QW6QQDlvxDgAm5A6o745e5eSi858FEz?= =?us-ascii?Q?9dA4Jcb1Zkx0V0rxpuMfL17l/al6ZU+rSkQS5HZaVBasqJVg3WJ9uApZKpPc?= =?us-ascii?Q?3yFGJvHqlShzfVl2QLC20UChpPN2WF3xnWdx6R+x1HIhfhMUzJy6Mxaxwxor?= =?us-ascii?Q?XdEStJYAl2TvcmoY0z3/4GgUXMQlukKVEafuVhF7xBlqTBU3VCSRuVISshog?= =?us-ascii?Q?SQC1m/H7eB+y6z5112xmTp9NMGb9xV/z44yn0KOAosmjWKpdLaXJHxu8Ijac?= =?us-ascii?Q?BUFIajwVWPOQiVbDdQSEe41vJ55EdYnXL34WYqnCCcrxxCQo12SoyGPUIYCO?= =?us-ascii?Q?YjhEqFe688vgJ0VAwHw/0cOoyM2sKJQdJdHM1VLR1P/ZJwZ6YaD02Xe798/n?= =?us-ascii?Q?b1UaDUiOmGIZyXCR1BMgfZmTfmjOhG00PVUno9g8prNoU9EG76O997/uu8/+?= =?us-ascii?Q?Qmun8Wzvk7P0S58+9ZWix/LBgMFO2OvW0UNQy3c/I6sx0Fnaua5ZGyQpAYAX?= =?us-ascii?Q?tWd9s7FF/lmHV0NWc04wSzPAd2b2gSZhQwgab9BlkupIDfePKguFIQFFV7TC?= =?us-ascii?Q?mik3pU0B7yo6uZ8XiJJ+UlJSQ43DrXa6DKkVgyKqbLdjAm33N7qwbP6UwHsT?= =?us-ascii?Q?zb+FdzdKFDHEmhImRlJ8XzJbmjUHlGQ8okuC3+mjPRUUupPthW54tsyd/LR6?= =?us-ascii?Q?I7Mfx/LVe6Y5YvibEIdzrMtCulfAqbWpoP+KBZSiY+if+ozdvgiOGBYSW1x1?= =?us-ascii?Q?M10K08MbOGm5iphyAGwM1+JN0ac0T8pWcSLWCCgHjyygfFtR2bUppbOjvAXU?= =?us-ascii?Q?J2+u16o8jfPvtj7W2NrkIeDSHsSMXIaw2fE9SsFEzhU7vNiUeu/SJpMf92Uj?= =?us-ascii?Q?JBw4I1KItcw5w1bPii03/VuADNjkEKODQPKNKybpvKEUC4jfjzmBk5vcqK9z?= =?us-ascii?Q?5NlpElGyzerP5MxZHSJlXv++K5ii7xTcYAZYHCYYSWI0MPBQALl6AZQRTLs0?= =?us-ascii?Q?h581DS5j2ZqwAipzuakcNEsSrjFk6UgRmcBwWA/2B+ycwHzVx/0lWiK93avl?= =?us-ascii?Q?RwLpuFLghz6Yu6fsS3NtmrkjeDb+Jr4ByemJnztwF4yZvcKty/5xhrW2LJfs?= =?us-ascii?Q?kX+c8FOchNg5t9gaHoPIC68BRZDdbcz7SoTz7nIumYDoVL70mJnPtP0EK/C0?= =?us-ascii?Q?fXTcyh7IHwAYbhH3NwSeGoIqzGWc9IzHfMXjkiB6UW7M3/3AQTGbI+6am+AV?= =?us-ascii?Q?U4NRVwvg4e13iAPcu0Cb7xSHIeNvLmM6I9QYjfu4ObgclMxSla4VTHfgKo3h?= =?us-ascii?Q?vikHH379kUwlZoIOfqIFd7RgQBsoSDGlgMxo?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?cwBx368tO7VRgQ+/MNVMbFHL0D204msfGJoYKZG0eyqjBu7Nk5uNpgr41//E?= =?us-ascii?Q?s893gdK64ckJHw6pecsr/peV5rDx/bbGfBUZhIX1Kkx7c1hpqH5urglfEiKd?= =?us-ascii?Q?CT8auZ04qJA4IAc7wiGEuXfMQlZDzNXLGb3/wp9N3SXwOPpwQLSaMjo8R5AJ?= =?us-ascii?Q?Lb7hIyKo/V7rXL3xFyc44JlC8W02eAVVEey2V16lF9O4JO1aZFCTX7qfM2DZ?= =?us-ascii?Q?pNZVdnqU93yg+StNsT+6ftp2vdOw9XR9PqeF4xhOZc4Dx1/zZOEqnacPUBX+?= =?us-ascii?Q?eokFZpAVZ3GoOkBMJnkm/5y1stq7het19Zwt9T2N8gcK+itOFH7YfDRQtHoN?= =?us-ascii?Q?IbNSV91mxnJYTUvVyzG9Yr5MMoM9wovPSs9yO8FR4nFCtZ9N9CBdDbD2AXrG?= =?us-ascii?Q?GtZ4m8+4NoIfRC8OEVGb0NOAq/y51int3QxFKUvp3i/oL4u864Jjx6ek2H0S?= =?us-ascii?Q?e3Aiu8SC49e34LHAOBizRf95yBAumqiBJzKMq2hcYVAYTAWAPtFnk/8M4WSi?= =?us-ascii?Q?GrZpQtAHX45MlJ3Ux1cDgPu7rLf2gEl4uff5U9tWaD8VQJWw4vXx5Zi3G7Gp?= =?us-ascii?Q?o3fgxUcuOFrApv3mSyS14GGYWo/kSlOTVnItCQVcF9m/34oXpsWM9T0D3BML?= =?us-ascii?Q?saMyr54DQDxdJF5hMxgQfvgmfrYRKm65xlr00RqovnrV3TW6frBXUiazlqAX?= =?us-ascii?Q?fNEkSXWfNI4oqo77WgLxucmhE8k8LQPNsxa0Wu9hcDOQc9NgtTxvU3Af0W7x?= =?us-ascii?Q?EG/WIfZMHAx/7QyN6YaqMNf+FVA+hPnOqTxhTBLF/o7WQL5v5WGV+pINbuGp?= =?us-ascii?Q?O2Xa++fDc1lFvsSmP1xZAoG/8YbsJjfZZ802jr8fDLlJ6fvuGOXbA72CCrr2?= =?us-ascii?Q?Iw8b7l2YD7V6jdKfNcXKoRYX0/inpsKi4yh0u5tCIQIdqjhIqoCS5QqUpgXv?= =?us-ascii?Q?IwwxdxJwSr+0bJeVOYPIyClyJ+rWb40NChvNRlVr/p7pibTJ1agmhf5QHfSL?= =?us-ascii?Q?LQAA5uZdYCLVK2sPn0vCs3IFX4g7fT3uhfBzxU94m+OWBZ/9UT9rfeRsSPhS?= =?us-ascii?Q?9Xf6gF2VMCe41FR7uIvyE64BntC0nXh+3Ppf6yUUvABC6arxyhkPecWxwSBk?= =?us-ascii?Q?bSKhwNXhLMOTtqhyp5kek61rG8oBHBj6Qp7dVHtgYyotwETiVs/DlLGSSjS2?= =?us-ascii?Q?zP3IQw3TxB3dRGDcCJU7hpP8ywv0Af1V7SSEp6JoSxuTnKNqPrZS53zehL7l?= =?us-ascii?Q?mMxO1FVCFt7QazfoMw+MQIoXAOviwpdB3DSPo4QsuqJs/YoyO6nKNEAXpLfe?= =?us-ascii?Q?uUE2I76KxlxFdPtBdwaEYjijq+MaD2LvOCKr3LHQR7NK6F9KTrcZOOJnhcoh?= =?us-ascii?Q?ax3erofZeGOGRtCz9+DY+ppP2aS9g1dh7fpXdr9To8hWjbYoWVbHqwD1x/K0?= =?us-ascii?Q?+/xxQSINRfhs9K/lkgakC6z/pN+efi01h2YWamqrf39bh9y3vm9dv9RgWYNc?= =?us-ascii?Q?p2gH6izELzz7gKibjggYFC1TALr4VtYoBXuQkY3ficqOv7AGOTYB7kGXzCyu?= =?us-ascii?Q?Pk7mSJEzEVwtx91BdUXDSl3IpRDggKV8osjCB6jk+uMibokzCMyVGTySiy8l?= =?us-ascii?Q?XA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 95729ba1-c647-4125-82ae-08de2ffd5b87 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:43:54.3306 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vJNwqFZ/PaK/x/wci3Mdrzl8gniDfpW6JkliALIfihxhhQJ+8ZUjpe/qgU7Ut6k2d3c22QGlN/RxIXQtwlWeZexntimkbjLe1bAH5mqxMQ8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Introduce a custom Rx routine using the GDL (Good Data Length) register to read multiple bytes from the Rx FIFO on Moxa UPCI serial boards. When no LSR error bits are present, the handler reads GDL bytes from UART_RX and inserts them into the TTY flip buffer. If error bits are detected, it falls back to the default serial8250_rx_chars() handler. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 37 ++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index 376c6d6135a3..ab6042f157c6 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -8,6 +8,7 @@ =20 #include #include +#include #include =20 #include "8250.h" @@ -42,6 +43,7 @@ =20 #define MOXA_UART_BASE_BAUD 921600 #define MOXA_UART_OFFSET 8 +#define MOXA_UART_FIFO_SIZE 128 =20 /* Enhanced Function Register (EFR) */ /* @@ -70,6 +72,8 @@ #define MOXA_UART_EFR_TX_FLOW_MASK GENMASK(3, 2) #define MOXA_UART_EFR_PAGE_MASK GENMASK(7, 6) =20 +#define MOXA_UART_GDL 0x07 /* Good data length register (enhanced mode onl= y) */ + /* Enhanced Registers Page 0 */ #define MOXA_UART_XON1 0x04 #define MOXA_UART_XON2 0x05 @@ -212,6 +216,30 @@ static void mxupci8250_unthrottle(struct uart_port *po= rt) uart_port_unlock_irqrestore(port, flags); } =20 +static void mxupci8250_rx_chars(struct uart_8250_port *up) +{ + struct uart_port *port =3D &up->port; + struct tty_port *tport =3D &port->state->port; + int recv_room, gdl, i; + u8 buf[MOXA_UART_FIFO_SIZE]; + + recv_room =3D tty_buffer_request_room(tport, port->fifosize); + + if (recv_room) { + gdl =3D serial_in(up, MOXA_UART_GDL); + + if (gdl > recv_room) + gdl =3D recv_room; + + for (i =3D 0; i < gdl; ++i) + buf[i] =3D serial_in(up, UART_RX); + + port->icount.rx +=3D gdl; + tty_insert_flip_string(tport, buf, gdl); + tty_flip_buffer_push(tport); + } +} + static int mxupci8250_handle_irq(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); @@ -234,9 +262,12 @@ static int mxupci8250_handle_irq(struct uart_port *por= t) !(port->read_status_mask & UART_LSR_DR)) skip_rx =3D true; =20 - if (lsr & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) - lsr =3D serial8250_rx_chars(up, lsr); - + if (lsr & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) { + if (lsr & UART_LSR_BRK_ERROR_BITS) + lsr =3D serial8250_rx_chars(up, lsr); + else + mxupci8250_rx_chars(up); + } serial8250_modem_status(up); =20 if ((lsr & UART_LSR_THRE) && (up->ier & UART_IER_THRI)) --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from SEYPR02CU001.outbound.protection.outlook.com (mail-koreacentralazon11023115.outbound.protection.outlook.com [40.107.44.115]) (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 040B027F75F; Sun, 30 Nov 2025 10:44:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.44.115 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499445; cv=fail; b=bazlCRZX0C4gPIWGR+xYLt4tp1E66p7RjnRA5oQHSlDmA7PrFt6ybdR/gOi9XOWA1u33w5mdEvBdQFMeCKAh34p9IyabEVM7Thsxhbs0NLHD/176CbJ3Ao6Gjb+dN1dPImQ0VxIyokikIje7KpqAXtB9JC0z/M1S+LMK4qIt5Uo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499445; c=relaxed/simple; bh=c0Rp1oB+4r0M4qMBkXqhLHMEv4vXY+RSVieb+ocAucA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Hn04yLcbcPEpHQbdHQnt0/K6peIWSPK/8U+u5qEbP1/yH8JPurROlMjfR8zCyYCfcr0z7eJqyIYOZ+8ImAaYdyloLQH/88tQFywimE8eV/2gEntKsm83abCX81nCUlZzla00bCjbsoxcJ+HVEg1VL58p2Nu7D6YJGNuqJmkc6hQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=ZCqMq5GZ; arc=fail smtp.client-ip=40.107.44.115 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="ZCqMq5GZ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kLE/8PWWKN6oqYrYC3bTPva+lBNHiQvvRZQeK1ugRaSKiHQO7lmH+6EI6jWJZq8btjMsd7mZeIR61MeuKbg26A2k/Nvn8ImEDYYYEq2N53FKIe+26/mEURO9II8vWeY6IZEA2f7uIUeT5daTtl4qkEJwacPJ/8KNeujWWIwshBNd4vVokTn/eKQ7X0YZ/bnylO0Xc2USknzVkz1DZkWe869bntPFObc/DvLfBQhCzLvzDTO5M+R9Zv5WAHo8Yvv+Hdla3l4HH4tX80dGp9it/xa1SbRsyx7EtArrp2GkuluvN/D1s2rCHjhgalJb/ZpyhhrHXKFpGhexfaVp9dghog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=FP6TpyU3i9JoWmrFzfZ1VWWgupLiSJ1mG1091RguLrI=; b=Jy993IAE4ToEziEHEniGQlZJxsxU/U5W+LONaKn0znCtbMbHVTDb1aAMAfderoFWPHm+xoSYc8TyaN5w6BPUFkBffFMi2ObngKpJpj3uEkSdbgRf2RiJx5ePcuBsNeKnIugjfuizl6Xfir2+5q+HL8OVlElletRHubz+7WhwGEF1qqxqeIb5AZLsyE5hDATrmZkPmM1EK+UaOShx2eTQyd8aS0qp7Y5oeoTPr6fEh1euUrSgaXFsyIZt4A9Xo9nMIpPgKKoE2g8QzE6BV2TIQ/1IIWygCZiAc4bxMF3J2FPEzjgEefKGM2ouLhh7yl8mZtXhEiW4FvQu9EwrZVz0dg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FP6TpyU3i9JoWmrFzfZ1VWWgupLiSJ1mG1091RguLrI=; b=ZCqMq5GZOiQsdDUm7W6mdn4He1mhe4LBJ715GNrM4nJQmexYfBc92tgViRPjviApMofRNQPw9JiRXhjKNAQvpss5VKmefe0oZTgpvrT+WjWLrxOK6Pz/SBytItrytNfUNkO7lx+vi0bqNWr6zD3prbCqFnOU1iC/K7kZhw3Y180= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:43:59 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:43:59 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 08/31] serial: 8250_mxupci: add custom Tx routine for 8250_mxupci Date: Sun, 30 Nov 2025 18:41:59 +0800 Message-ID: <20251130104222.63077-9-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 6d96de11-f1f0-4a5f-a965-08de2ffd5e98 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?b5KzWqxOlM8FcXUwucVrJC+JEGYQn7OhSZFmHHH/gRh2TEehaCOzMNH9tKJA?= =?us-ascii?Q?CKY37PS09HmQdfKqYAavia21uhiZZIdXVP6NgQW/Nt8VmMAV6Ww01Jom7wlE?= =?us-ascii?Q?X4b7sWdekGHN8TB+ScUkOMl94tfKHIFlAAu5/4o6Q8bZP4WXzvHKHel4Y6Q5?= =?us-ascii?Q?8IMfozNf4EZHXsSDcXJbvJxh6GQoAmJ1Us0CYX37jPO1sPCGNSmSLCfkOivq?= =?us-ascii?Q?rjjDAcWMWvDRMU5AOivuZlRJ3B0NOyFf1mW1BH40AA8Vd1UCYbCdE1I2G2MN?= =?us-ascii?Q?yNOImUVCDiM9JiKkL3q3zY7kLZm0jqVIRFHhmt6SJwzo9VncACuN5OEVTjDP?= =?us-ascii?Q?1xUPzzlarFF7UVINyMK5sNqdEejuIiW+hfkUVqeKPwHwXDL50Xpeyue6Ztud?= =?us-ascii?Q?bYklADsHei5crn63+uEimMLox6SMsB2A4uvkhZHfc+urNa9HmKpeASj3D5yN?= =?us-ascii?Q?7FxCwZ1RrIDcTsyJvFhqjz1cGhipq32rmqKuG619ybLdr98xr74NCQnqeY+g?= =?us-ascii?Q?tiHtLc4sp8xxxbf2RfXQFLP7eR5DGYWioDNcWR88XIGxKzH4lAMyxBqRTnOs?= =?us-ascii?Q?6OloJR5iMAdQafYl6/GoTHw9F3eDEzH9D5miLByHWvBkxiDZo1DAmu6+bYQH?= =?us-ascii?Q?NoJcpiZCHRLh6XgOpxI/H6fj82YetDgem8z1QtLz8rGPejEtoNhxWDwpi2PH?= =?us-ascii?Q?7oLIAqg1/4Yag0uGQSiTRQPdhzmHBkOkYbn9MRpYvYloiY8CiQawhOFTrtyE?= =?us-ascii?Q?2/ncZOpozHindcfZylImvbvTakfjkruq97y29/TOJDYDDeO+bzmo+Nw8xf1K?= =?us-ascii?Q?8dl77Q3zbyFnSR2lF9a/pYCIeeEa/UeyU/q0ZMAqi6sJEOF57h4dsijdV5Bo?= =?us-ascii?Q?D7qz/0kO+iKUrZwYxsvX++7LFyCrn6NGSYv1eA7qvkXjyybKZfbNCf5Y8G7J?= =?us-ascii?Q?uJId3I8JcZcJ/DrzgchO6oJY1L+pv0C3jgOFs2O/ok/8Kneld9Ps9ZJLbXBq?= =?us-ascii?Q?zePikkhhTjJ+YnRfYBrvjL1rXbfcfg2fVMb6DAbR+aw5nZaBkFmGg/YBI9hC?= =?us-ascii?Q?YPM2Nx0t3SHIfRwh01HdQ+CQdZPk1fsXqJkI3PQJO4WCJZgH+R6DSGFlBXix?= =?us-ascii?Q?qF5USeWn5qRMDFynZcxKL/CBQCHjisIM88gr3HcTYkS78fTOih2Xs0xVCFHr?= =?us-ascii?Q?SrGQjsnRJjT1vKpKe171Z3fpKrA1uxEV87IVRyxPja2egU5rkkVwq96qGUhR?= =?us-ascii?Q?9AXtarfe+i0VMruaOLwNq3uft9b4509Zk97Pe4FcQbkY254pOfS4e/FoQ79D?= =?us-ascii?Q?FEstbgSAzFKgEazaWTD6KxPhOnMRMFYWs8dfjZTCE42QlFTonwRocy4c8v1Z?= =?us-ascii?Q?CKpLR+iQI+HhnLS9qO/6Vrs/p+KFnknq/sJenpr5oCemgmXrvdD2vXb/9EB+?= =?us-ascii?Q?4qFMPLt8hEZj87cXef9TejKyNBBgWqWL3+GB2YBwqqoZVG7CQUkFmqbdDfob?= =?us-ascii?Q?GThMulk6qSOU0P4PKyot0DHwdoM0HyO6USZf?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?/Ajs23mZswQI4VgOngOQVd42cFA0XD+PEkeB13DuNazWrzb0rFiqFFqMdKa9?= =?us-ascii?Q?JqQCi/twDzZcELU2FlbPZqewOjH2spUnl0npj1VRE6hHA1d1it62oEszXcFR?= =?us-ascii?Q?syqdJHw6F0rQir6HPpnxiFgIdAHGuwTuojbot2B0O0kWYPsiJP4eJzbliOya?= =?us-ascii?Q?rgNAIDEiYLrJ5B6jAWt7L4kJLZavsD3K1pB3ioVB9XjtNcQkCIalJqozeu/T?= =?us-ascii?Q?6ezAgt1se1pj04pj017LoVqDxWYlEDR9ruvAlK203z14uMz9S4x2EM3VDvmO?= =?us-ascii?Q?T7aGSkW/xLvPzhEcDeRWQvSgjd/KPV/xwpQTOG1t0g3Jtt6ThO/phyLl/qfc?= =?us-ascii?Q?hQemUp0wUOdQH02shDMQBzFK+IM8UWl4iPzxdmfoGFCGrls4nIzo3CYdKm8+?= =?us-ascii?Q?BLUUg0+MQ/codhOaosLyj88MR7i+iX1AAiI03kizGLcG3ckxnDF8kCWhPe/o?= =?us-ascii?Q?RW83ZNTaFHDGh5b0iNVoEWfXs+IXMonBFCF0n6TKaAqwsR7DpLOGNTNhwq8+?= =?us-ascii?Q?6qQ+2UR+dGpMJIqtV39xh/GZzBnvutoMzHeJvBknGlZ6cf6CMyroOL2O4vft?= =?us-ascii?Q?TN8UsCquUTzfxLuNHEByuNZCGF90YW47YSh6NdPZiLyWyBaSYMrtJLNwpyql?= =?us-ascii?Q?daXaBPQm8hPhGVTtZ3k7eCXx60+TcNrAjuSqCZrUM83PE4Bht5bDCp5VGO/3?= =?us-ascii?Q?H3l/UZkU14vlmeeg0WtTu+PnPUDxu/d3GCkQT84bNIp3dhnhDsTcq7/gPOVv?= =?us-ascii?Q?jM+mRMUD6sLMEXtA7CyyQPbEXWQjpUMF7cuOPlUcEUuM4oswV4uyLVOczoLV?= =?us-ascii?Q?NZMdDhCCrawRbMmsKTDenp0aP4uwj+crCq56F70KDH5F3wjOmftE90xrYAve?= =?us-ascii?Q?SORzAtdzvFNH/U44cYSEPmeYTFZ0RRLetEYmHUU27OLEw127Gy9+flb+hYDj?= =?us-ascii?Q?QXjJG4u67sY2j0H8yzjGDlaHM/SkhyOiRjJ1O92TH89D6AK63kWAXFlRpQEA?= =?us-ascii?Q?4t9DhaAgHnzUJcXF4ePQAy+c2JGqqPOKMigbWqoiu1H9I6hKI9hDF17j7c/K?= =?us-ascii?Q?pnYwUFtlmLIBVYz8t85jt4XBqFBiP5sX2OBc9z+sJnKVm4b0Fw1GamVXyyzx?= =?us-ascii?Q?2NfrMz73631lL6T0a49qqVTCkLPmRNZnT8Z46asSx0zSfnxR/lhodj4DYmVq?= =?us-ascii?Q?Igv1C6ag0aUyEiOU45zSryveZwCxYmZDOZyp0OWkt/dbf7AYiEJbdcUeZz/j?= =?us-ascii?Q?tnYVl3Q/Gd35GRW3eZRsD0CjJOzIsmfEADuqN3nqWw04JIL5/SSNn6J4pFlk?= =?us-ascii?Q?g+sBrEUqst14HmXPzEF/2aoQTvqycIyh/P5TMfui+0Gcj/esX60NPv8YwGmV?= =?us-ascii?Q?ah+L+x2PgSGliuFxuTzMrBtv9adTL7IfErIgH3Fi1qmUTtvxJlxorTGSbXRS?= =?us-ascii?Q?niP7S8TTu9SW0YdFgVKTQRzdBn6SjC5GxPk9ABser9WHQuMFWsCVqrAc1cdI?= =?us-ascii?Q?OUprBQTDbutBXy1ZsCW64K39Rht3TOzXewiVVBOO2uEh/lAuCui54L/VN2T3?= =?us-ascii?Q?aB4AaE1NdiHJI6o80uN7p2+Gq9v4TXEuQYGlm40h4wFp/BJbSILbrJtW3rQT?= =?us-ascii?Q?nA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6d96de11-f1f0-4a5f-a965-08de2ffd5e98 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:43:59.4616 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hY/qOCY8CMNaqEUl+ljtdHaZ8OyfY1b3oFR4EJnVow8R0hM6KO7J3vPCuTn6z3gAydHgE3fuEkbBwT+/+RMUV7ATAisOVtPpHt9ZkHmXBPQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Implement a custom tx_chars() routine for Moxa MU860 UART to manage Tx FIFO and xmit buffer handling. The routine fetches up to fifosize bytes from the transmit FIFO and writes them to UART_TX using serial_out(). Wakeup and stop_tx conditions are handled based on FIFO state. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 33 ++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index ab6042f157c6..0eeaf0fa1538 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -240,6 +240,37 @@ static void mxupci8250_rx_chars(struct uart_8250_port = *up) } } =20 +static void mxupci8250_tx_chars(struct uart_8250_port *up) +{ + struct uart_port *port =3D &up->port; + struct tty_port *tport =3D &port->state->port; + unsigned int count, i; + unsigned char c; + + if (port->x_char) { + uart_xchar_out(port, UART_TX); + return; + } + if (uart_tx_stopped(port) || kfifo_is_empty(&tport->xmit_fifo)) { + port->ops->stop_tx(port); + return; + } + count =3D kfifo_len(&tport->xmit_fifo); + count =3D min(count, port->fifosize); + + for (i =3D 0; i < count; ++i) { + if (!uart_fifo_get(port, &c)) + break; + + serial_out(up, UART_TX, c); + } + if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS) + uart_write_wakeup(port); + + if (kfifo_is_empty(&tport->xmit_fifo) && !(up->capabilities & UART_CAP_RP= M)) + port->ops->stop_tx(port); +} + static int mxupci8250_handle_irq(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); @@ -271,7 +302,7 @@ static int mxupci8250_handle_irq(struct uart_port *port) serial8250_modem_status(up); =20 if ((lsr & UART_LSR_THRE) && (up->ier & UART_IER_THRI)) - serial8250_tx_chars(up); + mxupci8250_tx_chars(up); =20 uart_unlock_and_check_sysrq_irqrestore(port, flags); =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022138.outbound.protection.outlook.com [40.107.75.138]) (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 E325C2820D1; Sun, 30 Nov 2025 10:44:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.138 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499452; cv=fail; b=EFtICGhOBW0FmGPX4UdQuNf+cZom8Kc9Lef3YvdeHwKth0kAiTXj8Y8+FYF9luyFN7J4uv4Uz1o4NcJbGSs47pLsiVZ9U0ih2g7okzHh9qnUBdePNkHic21OjIerI8Kq9XGNJiwUZvRizPzsi7Z0NtfhflUmfiNoQDpfbCBPNxY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499452; c=relaxed/simple; bh=/69xuH+Hg22UUe1R1kdMC64ZwU9Ll5o6JsdSHNhQpao=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=gXpeA9lfqp1PG0Ix5twISzl9ON7/oCE8x6MsXDxWftB3rXqokPX9Xmz9pjCf9jwokZu/o2IcmSJt4R7MhjEFCmRwXa0eIXAzw6sWKHFSb8oFmFss4b6X6W8X6qoBJEPpUGUtlAurt8tVcy+n9DlZ9aKWZdXq60PLM83lGI+BbeI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=J33hypQO; arc=fail smtp.client-ip=40.107.75.138 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="J33hypQO" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GhDMAaHRZ5o/fn7lHbm5rfYUGp7tARkFHwfQx6TZh1meNzY8UgThGQCx9OvjsZJZ71vbkJVDDdfReQD/3sTpj40UG1N633ZYBoKi6CGZMOTuqcn/QnTcjwunBaSzcFjNchm/xapMC+lqfQIzkRvtyfC75eKo1Vk+Xx/8oozKj2GOex+RWCr9FHAH6BEiGBR7BD7mKhkhx9P+0B6Q7F99t0uWsPzd+62V762UkucWIkTOgidwqQ7j/bZRfBcLzEtZaAplfOF8bjiq485CPYQmZMMm+phZSM764FxXvMErQblxOvZ0N+ocaXLaDGtAzncwMnwTsl2gc34Vz3RBDQxUug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=kUompVVNk4obSlitX/YKejYooJ2XFrT/n3nOGtcbng8=; b=RmaHV2OAwC7n2vWJpx93/T0R2dDHZKIcm9sA2MED+sWCk1C27d+2UxVzH2BqL3k73UJhcJaOEijqIHdqOavk20W/qSjDEzRO3SYMfSlRQKyqMuUefLIHCwkvN9/o+Jx8XQlVAWrn9XO0a5hwEQ3xKTK9KVER153vq+0jl4BLgU7J2ZurHJh9CylcO8jhDdO15fMH5WG7fxRuUxhDTED8+7uhc7lAvb1F4Ti9PI5JvgFEj79PI+1trSokv4GwfbgNcX6E2ag5KK3F7pFNiRC5pPaX0mPq87+E7jB+5pzuEPH3WVRPpTyisdezzNpwiPxCLeIAF4BxPeViJh55QkL9Ew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kUompVVNk4obSlitX/YKejYooJ2XFrT/n3nOGtcbng8=; b=J33hypQOYHTrlBXjQbRnAnEgAVHvC9TnmD6Raikl1pp/+oH858a1BQnHo9eBtR0ggDyeVfvTwc0Nn8VL0baEXMZXrHE0K6s/7GfkdrJ/WZoIIj3GwaC4wUCBjssIjKLo9IUA5FaNS6ZzckG4/83YC9L8oUUWMTj6n3xpaRmXXKE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:04 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:04 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 09/31] serial: 8250: split 8250_mxpcie from 8250_pci Date: Sun, 30 Nov 2025 18:42:00 +0800 Message-ID: <20251130104222.63077-10-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: ce76c31a-baee-4244-2612-08de2ffd61d1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?8KTVXYLGmFc0yrmKIH/MLZDGtB6L5POeKm1ojgbYRuZL6nPhpaeOSiNF006S?= =?us-ascii?Q?xrL0egSVOBf3YzdWrAylN9bskHiS3/xoTZdpp0+zINrSDHRd6x4F42jazgqw?= =?us-ascii?Q?Q/AaZr7F92ygUx1Bw/7plzbzDsrDVXmIFWEkC4+XruWTs7v9EH4KkR4gzzUk?= =?us-ascii?Q?c/C0ONy/ksBn7yyPWxSvgyPHBX3d8Z+PyCowaMw98EiqmykwIDlEdZfwG5Yq?= =?us-ascii?Q?HLL2Mt92R1k77JLDk2ByOfLAs7JdeP1NO63i9tpMTq2q5JRG3ayQRTzAlNN6?= =?us-ascii?Q?a4g9bNdqsCd0LkcfHrFfIzXtMpeHsHTjdcdTZ1K8gri9mXN4XY2abBsCXCTV?= =?us-ascii?Q?oPhXQLZD0ynQVKhuxKYxCO30thvuvP7ZFnTjfZPH2hyp8dJ4XKfKlu2N9Wx6?= =?us-ascii?Q?cFFvgdKzkdtnj6bWhPP3AjUgpkxzeAglfRqMuTo/koPiQ6Li/zUF7tXpMHdH?= =?us-ascii?Q?MJHVR9vOlfrw32oTKErbzQZOiU9uc8xCJu5vBlNK/5a1n1wC1CtNWiX+Yo0T?= =?us-ascii?Q?8A6JX9os9qpF3fz3xRyJ+deNk/K3I+Kkkz6PZQHegejK2wFvQe9CkL1KnReu?= =?us-ascii?Q?Wci4bln79oVHY7z9f+zmMxJ19ZbY6AiUx3KPtqKcg3mlgtugkpMzFcLAWR6f?= =?us-ascii?Q?AjrTFvR0ncrj2whEK6jvh3Ijd/EyVp/IntjR445cCxAFvfohq1bslNcHP8Od?= =?us-ascii?Q?ei1EDB7lbU2yqrxJ0fjyD4cQKVEOg4IAHuVgEYFRhrWkc4UBHFUUNzGrcd9/?= =?us-ascii?Q?BZNTKazSvh62eX8fa89is+GEdf/Fd1WgmZOtG++YqFwTDckYygIPVvm0Qk4M?= =?us-ascii?Q?hqiTaRahypTpgoLY78w+67Oc3emrNWQNHUZgwXKBfQU1QG6RxjYRK6qA8skh?= =?us-ascii?Q?pu/QDM0uk73jC5k5GFfB/gJiWpIdYvWevv/Twwuq7usic19LgIHeNN5vcK48?= =?us-ascii?Q?mCv0qnw3z5OSQHWqlihCs6O3zHbqQgg8ZTuXZ6Qqf1L0bLlkk/WYNeo3kpc+?= =?us-ascii?Q?PT1q+gxotcKmuBielab4GelyIkth4Hqdy4Qh8ySzhuuNgeoLEK7YmuhA3MiB?= =?us-ascii?Q?qRFq6NCui2pbhrMJOQ54SUcdw0ve9rrM1AhPTIIIFyIbf/mTRoLi7gjgXFiU?= =?us-ascii?Q?FJ65p3Fxlg3lqxAxlGp9lNZ65VNwR3Pg9MQLhFaw1jhnyZz/6MWH9gfPHs5j?= =?us-ascii?Q?Ft5arHPM24drdnWFa922J1AGAc1GVlyu7q/sk2l/iuPWI3GycmhL7LXsvRbe?= =?us-ascii?Q?4LyhT9vrHn4LR2CKMJb7dvZG5c1lYsd3sV8dI7n2R2atz92e65RqrbyaDtzM?= =?us-ascii?Q?vG9aZpt1LA1lW6pOcydHNajjb/62nl8WIpLI6+UF5MhzbvPGfEc/b80/jWij?= =?us-ascii?Q?0YCKmMtuIqwvaCvHketAHFtdga6GdEjuz0MdvoOJC+eAZ0nrcUySGLdQ1zmd?= =?us-ascii?Q?TgP0LIbpHoRGecNtpxDmChHG3GrgUEWVBILVNO/viidvIGKIW1i4mc8H/v2U?= =?us-ascii?Q?eQJlizzEBcADVl3xg2NJvV8MdPxOR0Q5GMB0?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CdPnd1nPmvYaeQCAjuBIuZTOJX+KGuoSqD9x/k5YBtCYIoRNHYiY2aGtUbK1?= =?us-ascii?Q?sRNbPuQu6FFzQVB0Kh3EBU5vML9kriVzVbl5FGqT89tCSSapUwW0ckFUKJQJ?= =?us-ascii?Q?jeLmldLv1ZfWRmGiFN8NZps6bMJYKvXgLTlQoviOIpLb/Dxc5xIgwRFfiymJ?= =?us-ascii?Q?2VC67L2cnYrbb1qzzSHWvH8l+vcPhxtq8YPuzQ1lfImlBeYGT0gx6MJ+Pt/O?= =?us-ascii?Q?iMMYZAjqwJOLZnBHQqYmpJ+74keybi6A8JL3JTc00KooWC8j6ryhDGnqwj6v?= =?us-ascii?Q?sKvCfOlHoR3VUsDgZn6KvhrVrTnZ/h6Fth7MZrNMMFmZe/dJ3aFDRLI6BNHc?= =?us-ascii?Q?ax/clWATvgmUFg9lW6X+AYGdce5heU5pF3pDUJ6/lwhNYRoofrWeIYcu9H9c?= =?us-ascii?Q?cuRBOYMSmo4faq83sQI9lK3/OKcV9ccUoysOkEd4ey2RDTFanaJOvF8J9e2s?= =?us-ascii?Q?wP6r73HnHhurCPFqet0pwq2u5NWGMjMYQh2cVhElj9Tf1hroM4ZI/gl6EaDa?= =?us-ascii?Q?2ogzkZ7Ht/nZxgg5CQw5xl0RmpB6o8woPXUuYb2W3s50t4mvb1vXOQ8iXwiE?= =?us-ascii?Q?iY7Gray8FxfQIipDpVZ8D2ySErD6CIVHa4ZCIci5At7+WQMGPWcMGXuPNN/+?= =?us-ascii?Q?g3jP8cnlsJj3YmevYlUhkDKod58gYexqlkp5EpE9aG1t1srYhsuOZZFWu1eZ?= =?us-ascii?Q?2+SDTrgsEUsm2LlNhkvxaAK9xX+q5F6pxwPN4ZoQAOhxa6N5KZzcJEKbST69?= =?us-ascii?Q?Oo13me4mzXAwRVAaAP0+1V4aGQjWFdBqjemaujDY4jpi6a98LpbjcURg7TYL?= =?us-ascii?Q?U/LNN6z1cUArWfQYNPTjRzBuynhjmXuJQkp/SxSYksY7WZpw8V6vxm2NONIn?= =?us-ascii?Q?bxOzFTZQvpExziNJ0KDhiVJ/uYsIhScgH/+8uWMmn4P0+WumHSjPC7oG+iv/?= =?us-ascii?Q?dNQ18LCFAxWaHHC2aQ8hJNey5Fmb+ZC+GpYhBT8nttIgKVP0tm0n1AiYts5m?= =?us-ascii?Q?UPOeUlDeWwLt55bWxiosStU0+SRcIWcmKWo/A/VHoijTCvjIWree2T09UA/Z?= =?us-ascii?Q?CuNb4CCTuH3j8RvJiFXk3bsiRhGsbMKg7Fnf3sW67bjo1EI6qA4WvU2yapeT?= =?us-ascii?Q?DUGcyqwE1Qs/Y0XGuhVkKQpqM+IsDkVnhEMzNz1IUs9gS4okC98sKsulL8Js?= =?us-ascii?Q?C68dB55UPhXVMmOBuiJ2c7gctOhKEL6J27Jy1CzdxPaWr9GxYqy4cre6oEoZ?= =?us-ascii?Q?yUXEpfmU44VBC1P5FCXV0SpgHFbrkTqjkH7ga0ETLj1HggIa33ej9BOMw6Tq?= =?us-ascii?Q?46LXGA/5kMyfRGIzRSK8hIa+F2Q488P7MUjB1cL1CKtKU07Fw2+RmObUqGgd?= =?us-ascii?Q?BKCugHSlCkSqg7WCVT1ejG3APzpAnpVh/ShYXqicsnVu9IherfjFGOToCheC?= =?us-ascii?Q?E+sA4gk9HozdDpEkzv3NTTiqet5SV5Bn2W4wvNZP9aHpe8Ddrz1VbZaWrrTa?= =?us-ascii?Q?VriePkelJ11pLVhR9QTXh8HejfizXXRn6faNaEwEnVSFT8sTRwmipV5cKaNQ?= =?us-ascii?Q?1HsZjG7I08gvVAh7C1M3CT5Dvqb3kVU8swSE4Cxq5BoVrJyhh5TgV0gmwLnt?= =?us-ascii?Q?kA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: ce76c31a-baee-4244-2612-08de2ffd61d1 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:04.8861 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: zMgBLb0XYl9yZQlR3zkuQxmOZVYus4IU4xnylybESDAnl8wc62Su6095TnSqmqkVFJMuC29x810pDUjQJO1Fta5Vst5B76W2/4oOR1nnZF4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" To avoid polluting 8250_pci, as suggested by Andy Shevchenko, this patch separates 8250_mxpcie into its own module. - https://lore.kernel.org/all/ZmQovC6TbDpTb3c8@surfacebook.localdomain/ Signed-off-by: Crescent Hsieh Suggested-by: tag? --- drivers/tty/serial/8250/8250_mxpcie.c | 277 ++++++++++++++++++++++++++ drivers/tty/serial/8250/8250_pci.c | 205 ------------------- drivers/tty/serial/8250/Kconfig | 11 + drivers/tty/serial/8250/Makefile | 1 + 4 files changed, 289 insertions(+), 205 deletions(-) create mode 100644 drivers/tty/serial/8250/8250_mxpcie.c diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c new file mode 100644 index 000000000000..2e26307a9fee --- /dev/null +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * 8250_mxpcie.c - Moxa PCIe multiport serial device driver + * + * Copyright (C) 2025 Moxa Inc. (support@moxa.com) + * Author: Crescent Hsieh + */ + +#include +#include +#include + +#include "8250.h" +#include "8250_pcilib.h" + +#define PCI_DEVICE_ID_MOXA_CP102E 0x1024 +#define PCI_DEVICE_ID_MOXA_CP102EL 0x1025 +#define PCI_DEVICE_ID_MOXA_CP102N 0x1027 +#define PCI_DEVICE_ID_MOXA_CP104EL_A 0x1045 +#define PCI_DEVICE_ID_MOXA_CP104N 0x1046 +#define PCI_DEVICE_ID_MOXA_CP112N 0x1121 +#define PCI_DEVICE_ID_MOXA_CP114EL 0x1144 +#define PCI_DEVICE_ID_MOXA_CP114N 0x1145 +#define PCI_DEVICE_ID_MOXA_CP116E_A_A 0x1160 +#define PCI_DEVICE_ID_MOXA_CP116E_A_B 0x1161 +#define PCI_DEVICE_ID_MOXA_CP118EL_A 0x1182 +#define PCI_DEVICE_ID_MOXA_CP118E_A_I 0x1183 +#define PCI_DEVICE_ID_MOXA_CP132EL 0x1322 +#define PCI_DEVICE_ID_MOXA_CP132N 0x1323 +#define PCI_DEVICE_ID_MOXA_CP134EL_A 0x1342 +#define PCI_DEVICE_ID_MOXA_CP134N 0x1343 +#define PCI_DEVICE_ID_MOXA_CP138E_A 0x1381 +#define PCI_DEVICE_ID_MOXA_CP168EL_A 0x1683 + +/* UART */ +#define MOXA_PUART_BASE_BAUD 921600 +#define MOXA_PUART_OFFSET 0x200 + +#define MOXA_GPIO_DIRECTION 0x09 +#define MOXA_GPIO_OUTPUT 0x0A + +#define MOXA_GPIO_PIN2 BIT(2) + +#define MOXA_UIR_OFFSET 0x04 +#define MOXA_UIR_RS232 0x00 +#define MOXA_UIR_RS422 0x01 +#define MOXA_UIR_RS485_4W 0x0B +#define MOXA_UIR_RS485_2W 0x0F + +#define MOXA_EVEN_RS_MASK GENMASK(3, 0) +#define MOXA_ODD_RS_MASK GENMASK(7, 4) + +struct mxpcie8250 { + struct pci_dev *pdev; + unsigned int supp_rs; + unsigned int num_ports; + int line[]; +}; + +enum { + MOXA_SUPP_RS232 =3D BIT(0), + MOXA_SUPP_RS422 =3D BIT(1), + MOXA_SUPP_RS485 =3D BIT(2), +}; + +static bool mxpcie8250_is_mini_pcie(unsigned short device) +{ + if (device =3D=3D PCI_DEVICE_ID_MOXA_CP102N || + device =3D=3D PCI_DEVICE_ID_MOXA_CP104N || + device =3D=3D PCI_DEVICE_ID_MOXA_CP112N || + device =3D=3D PCI_DEVICE_ID_MOXA_CP114N || + device =3D=3D PCI_DEVICE_ID_MOXA_CP132N || + device =3D=3D PCI_DEVICE_ID_MOXA_CP134N) + return true; + + return false; +} + +static unsigned int mxpcie8250_get_supp_rs(unsigned short device) +{ + switch (device & 0x0F00) { + case 0x0000: + case 0x0600: + return MOXA_SUPP_RS232; + case 0x0100: + return MOXA_SUPP_RS232 | MOXA_SUPP_RS422 | MOXA_SUPP_RS485; + case 0x0300: + return MOXA_SUPP_RS422 | MOXA_SUPP_RS485; + } + + return 0; +} + +static unsigned short mxpcie8250_get_nports(unsigned short device) +{ + switch (device) { + case PCI_DEVICE_ID_MOXA_CP116E_A_A: + case PCI_DEVICE_ID_MOXA_CP116E_A_B: + return 8; + } + + return FIELD_GET(0x00F0, device); +} + +static int mxpcie8250_set_interface(struct mxpcie8250 *priv, + unsigned int port_idx, + u8 mode) +{ + resource_size_t iobar_addr =3D pci_resource_start(priv->pdev, 2); + resource_size_t UIR_addr =3D iobar_addr + MOXA_UIR_OFFSET + port_idx / 2; + u8 cval; + + cval =3D inb(UIR_addr); + + if (port_idx % 2) { + cval &=3D ~MOXA_ODD_RS_MASK; + cval |=3D FIELD_PREP(MOXA_ODD_RS_MASK, mode); + } else { + cval &=3D ~MOXA_EVEN_RS_MASK; + cval |=3D FIELD_PREP(MOXA_EVEN_RS_MASK, mode); + } + outb(cval, UIR_addr); + + return 0; +} + +static int mxpcie8250_init(struct pci_dev *pdev) +{ + resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); + u8 cval; + + /* Initial terminator */ + if (pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP114EL || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP118EL_A) { + outb(0xff, iobar_addr + MOXA_GPIO_DIRECTION); + outb(0x00, iobar_addr + MOXA_GPIO_OUTPUT); + } + /* + * Enable hardware buffer to prevent break signal output when system boot= s up. + * This hardware buffer is only supported on Mini PCIe series. + */ + if (mxpcie8250_is_mini_pcie(pdev->device)) { + /* Set GPIO direction */ + cval =3D inb(iobar_addr + MOXA_GPIO_DIRECTION); + cval |=3D MOXA_GPIO_PIN2; + outb(cval, iobar_addr + MOXA_GPIO_DIRECTION); + /* Enable low GPIO */ + cval =3D inb(iobar_addr + MOXA_GPIO_OUTPUT); + cval &=3D ~MOXA_GPIO_PIN2; + outb(cval, iobar_addr + MOXA_GPIO_OUTPUT); + } + + return 0; +} + +static int mxpcie8250_setup(struct pci_dev *pdev, + struct mxpcie8250 *priv, + struct uart_8250_port *up, + int idx) +{ + unsigned int bar =3D FL_GET_BASE(FL_BASE1); + int offset =3D idx * MOXA_PUART_OFFSET; + u8 init_mode =3D MOXA_UIR_RS232; + + if (!(priv->supp_rs & MOXA_SUPP_RS232)) + init_mode =3D MOXA_UIR_RS422; + + mxpcie8250_set_interface(priv, idx, init_mode); + + if (idx =3D=3D 3 && + (pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP104EL_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP114EL || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP134EL_A)) + offset =3D 7 * MOXA_PUART_OFFSET; + + return serial8250_pci_setup_port(pdev, up, bar, offset, 0); +} + +static int mxpcie8250_probe(struct pci_dev *pdev, const struct pci_device_= id *id) +{ + struct uart_8250_port up; + struct mxpcie8250 *priv; + unsigned int i, num_ports; + int ret; + + ret =3D pcim_enable_device(pdev); + pci_save_state(pdev); + + if (ret) + return ret; + + num_ports =3D mxpcie8250_get_nports(pdev->device); + + priv =3D devm_kzalloc(&pdev->dev, struct_size(priv, line, num_ports), GFP= _KERNEL); + + if (!priv) + return -ENOMEM; + + priv->supp_rs =3D mxpcie8250_get_supp_rs(pdev->device); + priv->num_ports =3D num_ports; + + mxpcie8250_init(pdev); + priv->pdev =3D pdev; + + memset(&up, 0, sizeof(up)); + + up.port.dev =3D &pdev->dev; + up.port.irq =3D pdev->irq; + up.port.uartclk =3D MOXA_PUART_BASE_BAUD * 16; + up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; + + for (i =3D 0; i < num_ports; i++) { + if (mxpcie8250_setup(pdev, priv, &up, i)) + break; + + dev_dbg(&pdev->dev, "Setup PCI port: port %lx, irq %d, type %d\n", + up.port.iobase, up.port.irq, up.port.iotype); + + priv->line[i] =3D serial8250_register_8250_port(&up); + + if (priv->line[i] < 0) { + dev_err(&pdev->dev, + "Couldn't register serial port %lx, irq %d, type %d, error %d\n", + up.port.iobase, up.port.irq, + up.port.iotype, priv->line[i]); + break; + } + } + pci_set_drvdata(pdev, priv); + + return 0; +} + +static void mxpcie8250_remove(struct pci_dev *pdev) +{ + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + unsigned int i; + + for (i =3D 0; i < priv->num_ports; i++) + serial8250_unregister_port(priv->line[i]); +} + +static const struct pci_device_id mxpcie8250_pci_ids[] =3D { + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102E) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102EL) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102N) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104EL_A) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104N) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP112N) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114EL) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114N) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_A) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_B) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118EL_A) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118E_A_I) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132EL) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132N) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134EL_A) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134N) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP138E_A) }, + { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168EL_A) }, + { } +}; + +static struct pci_driver mxpcie8250_pci_driver =3D { + .name =3D "8250_mxpcie", + .id_table =3D mxpcie8250_pci_ids, + .probe =3D mxpcie8250_probe, + .remove =3D mxpcie8250_remove, +}; + +module_pci_driver(mxpcie8250_pci_driver); +MODULE_AUTHOR("Moxa Inc."); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Moxa PCIe Multiport Serial Device Driver"); +MODULE_DEVICE_TABLE(pci, mxpcie8250_pci_ids); +MODULE_IMPORT_NS("SERIAL_8250_PCI"); diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8= 250_pci.c index 3c3f7c926afb..7327a370318e 100644 --- a/drivers/tty/serial/8250/8250_pci.c +++ b/drivers/tty/serial/8250/8250_pci.c @@ -82,25 +82,6 @@ #define PCIE_DEVICE_ID_WCH_CH384_8S 0x3853 #define PCIE_DEVICE_ID_WCH_CH382_2S 0x3253 =20 -#define PCI_DEVICE_ID_MOXA_CP102E 0x1024 -#define PCI_DEVICE_ID_MOXA_CP102EL 0x1025 -#define PCI_DEVICE_ID_MOXA_CP102N 0x1027 -#define PCI_DEVICE_ID_MOXA_CP104EL_A 0x1045 -#define PCI_DEVICE_ID_MOXA_CP104N 0x1046 -#define PCI_DEVICE_ID_MOXA_CP112N 0x1121 -#define PCI_DEVICE_ID_MOXA_CP114EL 0x1144 -#define PCI_DEVICE_ID_MOXA_CP114N 0x1145 -#define PCI_DEVICE_ID_MOXA_CP116E_A_A 0x1160 -#define PCI_DEVICE_ID_MOXA_CP116E_A_B 0x1161 -#define PCI_DEVICE_ID_MOXA_CP118EL_A 0x1182 -#define PCI_DEVICE_ID_MOXA_CP118E_A_I 0x1183 -#define PCI_DEVICE_ID_MOXA_CP132EL 0x1322 -#define PCI_DEVICE_ID_MOXA_CP132N 0x1323 -#define PCI_DEVICE_ID_MOXA_CP134EL_A 0x1342 -#define PCI_DEVICE_ID_MOXA_CP134N 0x1343 -#define PCI_DEVICE_ID_MOXA_CP138E_A 0x1381 -#define PCI_DEVICE_ID_MOXA_CP168EL_A 0x1683 - /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588 @@ -2000,138 +1981,6 @@ pci_sunix_setup(struct serial_private *priv, return setup_port(priv, port, bar, offset, 0); } =20 -#define MOXA_PUART_GPIO_EN 0x09 -#define MOXA_PUART_GPIO_OUT 0x0A - -#define MOXA_GPIO_PIN2 BIT(2) - -#define MOXA_RS232 0x00 -#define MOXA_RS422 0x01 -#define MOXA_RS485_4W 0x0B -#define MOXA_RS485_2W 0x0F -#define MOXA_UIR_OFFSET 0x04 -#define MOXA_EVEN_RS_MASK GENMASK(3, 0) -#define MOXA_ODD_RS_MASK GENMASK(7, 4) - -enum { - MOXA_SUPP_RS232 =3D BIT(0), - MOXA_SUPP_RS422 =3D BIT(1), - MOXA_SUPP_RS485 =3D BIT(2), -}; - -static unsigned short moxa_get_nports(unsigned short device) -{ - switch (device) { - case PCI_DEVICE_ID_MOXA_CP116E_A_A: - case PCI_DEVICE_ID_MOXA_CP116E_A_B: - return 8; - } - - return FIELD_GET(0x00F0, device); -} - -static bool pci_moxa_is_mini_pcie(unsigned short device) -{ - if (device =3D=3D PCI_DEVICE_ID_MOXA_CP102N || - device =3D=3D PCI_DEVICE_ID_MOXA_CP104N || - device =3D=3D PCI_DEVICE_ID_MOXA_CP112N || - device =3D=3D PCI_DEVICE_ID_MOXA_CP114N || - device =3D=3D PCI_DEVICE_ID_MOXA_CP132N || - device =3D=3D PCI_DEVICE_ID_MOXA_CP134N) - return true; - - return false; -} - -static unsigned int pci_moxa_supported_rs(struct pci_dev *dev) -{ - switch (dev->device & 0x0F00) { - case 0x0000: - case 0x0600: - return MOXA_SUPP_RS232; - case 0x0100: - return MOXA_SUPP_RS232 | MOXA_SUPP_RS422 | MOXA_SUPP_RS485; - case 0x0300: - return MOXA_SUPP_RS422 | MOXA_SUPP_RS485; - } - return 0; -} - -static int pci_moxa_set_interface(const struct pci_dev *dev, - unsigned int port_idx, - u8 mode) -{ - resource_size_t iobar_addr =3D pci_resource_start(dev, 2); - resource_size_t UIR_addr =3D iobar_addr + MOXA_UIR_OFFSET + port_idx / 2; - u8 val; - - val =3D inb(UIR_addr); - - if (port_idx % 2) { - val &=3D ~MOXA_ODD_RS_MASK; - val |=3D FIELD_PREP(MOXA_ODD_RS_MASK, mode); - } else { - val &=3D ~MOXA_EVEN_RS_MASK; - val |=3D FIELD_PREP(MOXA_EVEN_RS_MASK, mode); - } - outb(val, UIR_addr); - - return 0; -} - -static int pci_moxa_init(struct pci_dev *dev) -{ - unsigned short device =3D dev->device; - resource_size_t iobar_addr =3D pci_resource_start(dev, 2); - unsigned int i, num_ports =3D moxa_get_nports(device); - u8 val, init_mode =3D MOXA_RS232; - - if (!IS_ENABLED(CONFIG_HAS_IOPORT)) - return serial_8250_warn_need_ioport(dev); - - if (!(pci_moxa_supported_rs(dev) & MOXA_SUPP_RS232)) { - init_mode =3D MOXA_RS422; - } - for (i =3D 0; i < num_ports; ++i) - pci_moxa_set_interface(dev, i, init_mode); - - /* - * Enable hardware buffer to prevent break signal output when system boot= s up. - * This hardware buffer is only supported on Mini PCIe series. - */ - if (pci_moxa_is_mini_pcie(device)) { - /* Set GPIO direction */ - val =3D inb(iobar_addr + MOXA_PUART_GPIO_EN); - val |=3D MOXA_GPIO_PIN2; - outb(val, iobar_addr + MOXA_PUART_GPIO_EN); - /* Enable low GPIO */ - val =3D inb(iobar_addr + MOXA_PUART_GPIO_OUT); - val &=3D ~MOXA_GPIO_PIN2; - outb(val, iobar_addr + MOXA_PUART_GPIO_OUT); - } - - return num_ports; -} - -static int -pci_moxa_setup(struct serial_private *priv, - const struct pciserial_board *board, - struct uart_8250_port *port, int idx) -{ - unsigned int bar =3D FL_GET_BASE(board->flags); - int offset; - - if (!IS_ENABLED(CONFIG_HAS_IOPORT)) - return serial_8250_warn_need_ioport(priv->dev); - - if (board->num_ports =3D=3D 4 && idx =3D=3D 3) - offset =3D 7 * board->uart_offset; - else - offset =3D idx * board->uart_offset; - - return setup_port(priv, port, bar, offset, 0); -} - /* * Master list of serial port init/setup/exit quirks. * This does not describe the general nature of the port. @@ -2931,17 +2780,6 @@ static struct pci_serial_quirk pci_serial_quirks[] = =3D { .setup =3D pci_fintek_setup, .init =3D pci_fintek_init, }, - /* - * MOXA - */ - { - .vendor =3D PCI_VENDOR_ID_MOXA, - .device =3D PCI_ANY_ID, - .subvendor =3D PCI_ANY_ID, - .subdevice =3D PCI_ANY_ID, - .init =3D pci_moxa_init, - .setup =3D pci_moxa_setup, - }, { .vendor =3D 0x1c29, .device =3D 0x1204, @@ -3159,9 +2997,6 @@ enum pci_board_num_t { pbn_titan_2_4000000, pbn_titan_4_4000000, pbn_titan_8_4000000, - pbn_moxa_2, - pbn_moxa_4, - pbn_moxa_8, }; =20 /* @@ -3933,24 +3768,6 @@ static struct pciserial_board pci_boards[] =3D { .uart_offset =3D 0x200, .first_offset =3D 0x1000, }, - [pbn_moxa_2] =3D { - .flags =3D FL_BASE1, - .num_ports =3D 2, - .base_baud =3D 921600, - .uart_offset =3D 0x200, - }, - [pbn_moxa_4] =3D { - .flags =3D FL_BASE1, - .num_ports =3D 4, - .base_baud =3D 921600, - .uart_offset =3D 0x200, - }, - [pbn_moxa_8] =3D { - .flags =3D FL_BASE1, - .num_ports =3D 8, - .base_baud =3D 921600, - .uart_offset =3D 0x200, - }, }; =20 #define REPORT_CONFIG(option) \ @@ -5811,28 +5628,6 @@ static const struct pci_device_id serial_pci_tbl[] = =3D { PCI_ANY_ID, PCI_ANY_ID, 0, 0, pbn_ni8430_4 }, =20 - /* - * MOXA - */ - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102E), pbn_moxa_2 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102EL), pbn_moxa_2 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102N), pbn_moxa_2 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104EL_A), pbn_moxa_4 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104N), pbn_moxa_4 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP112N), pbn_moxa_2 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114EL), pbn_moxa_4 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114N), pbn_moxa_4 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_A), pbn_moxa_8 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_B), pbn_moxa_8 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118EL_A), pbn_moxa_8 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118E_A_I), pbn_moxa_8 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132EL), pbn_moxa_2 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132N), pbn_moxa_2 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134EL_A), pbn_moxa_4 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134N), pbn_moxa_4 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP138E_A), pbn_moxa_8 }, - { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168EL_A), pbn_moxa_8 }, - /* * ADDI-DATA GmbH communication cards */ diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kcon= fig index e8b2878f8ab0..0db3ea0fd1d1 100644 --- a/drivers/tty/serial/8250/Kconfig +++ b/drivers/tty/serial/8250/Kconfig @@ -157,6 +157,17 @@ config SERIAL_8250_EXAR 422x PCIe serial cards that are not covered by the more generic SERIAL_8250_PCI option. =20 +config SERIAL_8250_MOXA_PCIE + tristate "8250/16550 Moxa PCIe device support" + depends on SERIAL_8250 && PCI + select SERIAL_8250_PCILIB + default SERIAL_8250 + help + Say Y here if you have a Moxa PCIe serial card. + + To compile this driver as a module, choose M here: the + module will be called 8250_mxpcie. + config SERIAL_8250_MOXA_UPCI tristate "8250/16550 Moxa UPCI device support" depends on SERIAL_8250 && PCI diff --git a/drivers/tty/serial/8250/Makefile b/drivers/tty/serial/8250/Mak= efile index da9d35911bd5..cf871a3a1fb7 100644 --- a/drivers/tty/serial/8250/Makefile +++ b/drivers/tty/serial/8250/Makefile @@ -39,6 +39,7 @@ obj-$(CONFIG_SERIAL_8250_LPC18XX) +=3D 8250_lpc18xx.o obj-$(CONFIG_SERIAL_8250_LPSS) +=3D 8250_lpss.o obj-$(CONFIG_SERIAL_8250_MEN_MCB) +=3D 8250_men_mcb.o obj-$(CONFIG_SERIAL_8250_MID) +=3D 8250_mid.o +obj-$(CONFIG_SERIAL_8250_MOXA_PCIE) +=3D 8250_mxpcie.o obj-$(CONFIG_SERIAL_8250_MOXA_UPCI) +=3D 8250_mxupci.o obj-$(CONFIG_SERIAL_8250_MT6577) +=3D 8250_mtk.o obj-$(CONFIG_SERIAL_OF_PLATFORM) +=3D 8250_of.o --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYDPR03CU002.outbound.protection.outlook.com (mail-japaneastazon11023118.outbound.protection.outlook.com [52.101.127.118]) (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 2CA5727B4FA; Sun, 30 Nov 2025 10:44:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.127.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499456; cv=fail; b=EXPF7NwQw92dsafSlaG8TvlhS5wrcZ+KYFNkepu1ajTt8TSqCv20i5BVjLD4ygojjtExgPdLt7VrpA7tnatP9KKpwlP2LmK0zu4eo8OsO43QS1q51hggjdildBI2yG2rBQZX+tzWiJV6arKSU/p/Fz7Uwq6DwopH/TxrdEXWG4w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499456; c=relaxed/simple; bh=DEbxYPU+GhquzYHyONUv/s/jGY/LdKTRVZBpII6qVn8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=BMNifJ4wL+N/aZOa/5kltlrOvk25VxMK5+v8M/jh2sbt0pVxhF+NgCJBJ6sVla4fe3z4fDuzOmYrz2jxojjUnkc9yMGGuIzN/gSemkJsOj8cJG1CYdtx3fGxM0tNCeuCiu7DAze35p4ejmPGl7UBIofHksunHHFdeU6uFvZAtHI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=OgbMkzWa; arc=fail smtp.client-ip=52.101.127.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="OgbMkzWa" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ktdmR2Vu09xf4QRnr8prHfYQi/IiEWaNWlUZSGFm+/2pKe29Gy8h7CP2bNGk0Do7jhnC9qs1QUxPHt2/V9WRaFAgDZ+9mZmpW//9TdtjjqJKGubqvJC14mPQPAX4C0pSSnVe5TAvM+MpaURQ3EDmGllGtnQ0iR4xlVvmf+aArn84v0acYIT3azzdWmdd+DM8FaE8g67WtaRzrnQnOx2TqDr+m2CtLl06NyuxReEdgt0kuy0IlYiNFpAXTKwSN4h/YuB3+IALD/id0XFGSt6ZYZoT1gAEy41021EE/Vhp3pY1JUAuIk0ikwjq8laEv3lYxmMYFRRmChjWOoxU0NtWSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Fehd1IhITRgiIYMlYfvUuv9L5JSm7UiF/E8zJF2ihTc=; b=ThU9NLZjGVI1aSk95QJXgXT3cLhwplAQpjEpnhvG+5QqVkpbGjiot8WBsG8n9aKNf4KDchOYTff7maIaUp9eSvQer7xhn2RxpDFmYguNmwgJ0UgG45Or/kT5fH75US8/6XACmMtk//c+zqRyURF53Vt/Frcx36BS/o/1X873FoYorbbENG964s9YxMKKFqE0GBvucuzZK3L/RwSltOZ/bPATUkGQRSgT3ihxxC9LphGdwEO6jnzMrhsOWuTqrm9j7G8DIXXO6MBcWpOjrAz3Mky/IaSPD/NFlpUEWdZltXrFOZo2AAV8zIY4XM6xlhdEQhdhX7BcyHiUXe2PRgWt3Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Fehd1IhITRgiIYMlYfvUuv9L5JSm7UiF/E8zJF2ihTc=; b=OgbMkzWac648aY9nPH2ZjEa0j68qrD6f9m0jAxcW9xySVuXuuaKJw7BpEXSH669ecYx/pO4LtCjUSnFJqRKWJVdIE33c4u26KHZemoS5the1Lh8AzOzHSrYeFAn4huSh5QTcFFtV+oCSBFvM5ussld/OIYGSaGvO4CZ28J9R+F0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:10 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:10 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 10/31] serial: 8250: add MUEx50 UART configuration Date: Sun, 30 Nov 2025 18:42:01 +0800 Message-ID: <20251130104222.63077-11-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: f884f50f-f14e-4d15-9370-08de2ffd653b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?KkOtcIiQawAbIFBbjrLLD+YGS3lempEFQhgqw28Ad88vTZiJe4oA2WKI0cR0?= =?us-ascii?Q?S/89A14EvC4Ndr+/iKi9FNpp2jt43dWqWW0ww1SdzF0L8xwHqOU3fDEeNm6n?= =?us-ascii?Q?j7ftPTHtmD9NVD4a5t1zAmhGckLVRqsxe6BAbrwYVf1N4PNbKVhozrMTnCvT?= =?us-ascii?Q?HZi2UMlgFlrQbs4HJq1kwai4y4aCawW+ZPCbApmg3TsPdJQFSE+oVbZPdxjX?= =?us-ascii?Q?ka3kiIJsM+rkKZu9inaR3owtM74mFeTMrx7Tv9E9U9IE8sTUMx7f2QMYph8X?= =?us-ascii?Q?sDuZb4T4Ek4Rjo710bE/SS3FWE2SIJt93yiBylyd/JaO/ZCEVpseXbZr30qe?= =?us-ascii?Q?QHxgggatqNsaj/a8HpXXsih665vT+aucQ17IZ70k9OP+OuF5WdPeHgZ557gA?= =?us-ascii?Q?dZM7qEguzZr5XJyCSLvA9e4jb763RapUPkr6sd6Mkq8RT3KOj5Pd88DIKlpj?= =?us-ascii?Q?ffD83aFoIHKvInMISfh/vp4Igi07+EuCy2J3CPhyHkKcl9Gs0nbx/5aY4/4x?= =?us-ascii?Q?ulAr56RPMsK81qc2cVHuw8Kpo1CqG5c1SSik4+YNywty5luitKREd/JqTZtH?= =?us-ascii?Q?mVRRcQTjZpcVfGkaRdZN9dQgI+X/irY3E5GUrYN2m7StWrwTMgQVyAgthXlH?= =?us-ascii?Q?WAnuxdtfhFnjHhddiYRuIu24wsxo1rwBjrOnVlq+Keq7x0NzsS7OSIdpYEdW?= =?us-ascii?Q?lwb9OXnnepz3GVD9JZ0kpQsNXekYM3zAxPicZoKMzCl5EUaVCDlm+kjW6PPI?= =?us-ascii?Q?xEPN5oUEa+O3qguHLARuuic2jM7NeIx9cMOdoA1352kx2wrQOE6PLY6TiVUt?= =?us-ascii?Q?Da/EIXj1T+wab+iC6v/LiERYyBsGHUNQB9SfhBLTzLU29Ousz3VO0k/10Gul?= =?us-ascii?Q?+HcVhBlfk3Z4z+qZGHalVKBWJVUXeO9+cxP/BQtLHmDiUOzBrMv69y9c9PaU?= =?us-ascii?Q?q7KGxMfvHNZ8YU1eVpk3/n7VsZPpdJr+hyd5AubPdECzQPN5vwAjKGqtMtnL?= =?us-ascii?Q?r9QkBKhs/Y+6nqIKYGGKDyBMUN0eJn9FbHBz3aPfyaJDTpX7YuZuNQ5yWQq4?= =?us-ascii?Q?ivOrsaV1kNhGHqkXFPlYiYyWVMIMaSgXxmZZhWLPslLYmSDttpC9hnfhcUti?= =?us-ascii?Q?VmF6nQGbapzODRQf+469I89yDzL5/432G8pIKws+UxLkB++rdVeN8CIcrNu9?= =?us-ascii?Q?AjF7cEI7qmpnpwZkLOWkGCpnsX3ZHwSe6QscHD5b7Oe01Fe76w8FwHRTrqQ7?= =?us-ascii?Q?v8gba0aJZLYNBNwK54rEkGuOx3Q1SQUO2VIH60H+lhU1elA8gSm7zuL2u74A?= =?us-ascii?Q?gIDXUIL+vZWnKkDyFDogqpXd8WJJW1CtZm3zhDQR2KJeLusDc7o5WE9/mmn0?= =?us-ascii?Q?+1BAEvwk2WxlXMwxlCry/1Qi5c+6N1KZr0YHGlCImFWpfiAkqqeAOeB8/Mhe?= =?us-ascii?Q?L/1mZ61cThSaNutmMUyZaSXGpmXtHtf2ao4o23cyCVYi/Mw96WoKHxZ8vKsh?= =?us-ascii?Q?unhVFHacGVRrgh0wRBaQaR1H91zCHpVJK4io?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?e/tGshnQYO/QIrdiDJ3YR+38IyQnepMhffD63sn4F1455dItvGlNXSbwcpDV?= =?us-ascii?Q?H2GMXOEkXhgvDppF7euUjvZcdcXh9K9ZjrNcrN94fJG5nxBkrNGQJ0VynTgj?= =?us-ascii?Q?d+xera2aQwXKNa5UnvuVO11fQBymMq7RYBZzfuWbjPpFkWMFCTEslTUuR1O7?= =?us-ascii?Q?mm+3Wss9ua/MJqRXkmiKfs1eJrFXWuaCq3l+iEFQdjAG2BUGyn/QQ5ynwemK?= =?us-ascii?Q?V0E/Hf1vNceAUlPRUKPlVOYXEwRSs5aoLyafO/RRHtJwY905Uk1487B4ZSlP?= =?us-ascii?Q?JJFJSNGyylf8c8T2x27jjF50e/lsZdo3xc/Mk3XgnnaFmyQZq9siNrqgwNE+?= =?us-ascii?Q?+w8GxyMiwI0QMpZmpBPsHGYQDPI03/CV7cpeeuNUr07XpBHYjSyhxKVCP9ga?= =?us-ascii?Q?uLPV9395/i3t97BfZzqLn9Ckefo8iNvcoKqoQOXz6YCj02rmFIt9ppm3pgQd?= =?us-ascii?Q?hE9F53ls9RJF3rQpm53LIPjOlAbai3UrYwOW1HSc4RqNBOFbYwjyIf+DzqMU?= =?us-ascii?Q?/hw53cYey7uaLaMYN7ftaseGJfz4EK2weMYahjsgSbk3rOpb74Q09PKXypzg?= =?us-ascii?Q?qvMA/+kdiIvvMV+k8k5ICSxG+jOY0T2cRJI+e99CW3hX4txtKcnrOim/nhmS?= =?us-ascii?Q?xuRpAO0FcAF9PQVcBWgttEYMM66MyRj/MRc/D37IINogySMthT5MNXdq7Wgf?= =?us-ascii?Q?IWlB2TNzyiX/PD3FJP8fDZ+3C+61hEBUvrTNw4MCYjhu2XGeatWgXFYe8dix?= =?us-ascii?Q?Mq+XuK0Zg5eIG/IR96KXDawfSvyLwdzdELY6bSx709canlbeHe/eZBz2GEA4?= =?us-ascii?Q?rIRpr/GtdDOINB5/yVW2gu0vm5t2W+5887V1qzgRdblcUDjOlGYMdnW/Blit?= =?us-ascii?Q?09qx04E+GfElfZiyxX536dAIUbg9OU0BOoKc3xdGh4zO1AJcq9fPoBrI0yb/?= =?us-ascii?Q?h5osoVYy6UMttT3wMyZ1mGEsekquVXGKTd6cCNMTdOuntFSu+QFcNKK1PmW1?= =?us-ascii?Q?2JzIY4af3FslEjLRqkdXj+Z4nX2rkGz0Peuo1MZ5XCkpGJbfILPo33YlhCBo?= =?us-ascii?Q?njhuyAIiZA98WxnIOmCI/v3HEGdwKtBdI/sJNbzemGAsrfyTCTtD9y3vUM5o?= =?us-ascii?Q?W9hdJiTsiSlrejQKFM/UL+DVhYTCOO7oO0Hjfq6JG+34eqqs6UW6TCjxUZP3?= =?us-ascii?Q?G63KJJBcWAC5SpiTE7ax88G5Tc00ZnzufsMg3ipXTg4G4mKQ/VZII/c1Tr+b?= =?us-ascii?Q?Rt5CN2WaEoNhTzYB/tZHTY3ct2VKoUNRxeVilDG/CbMwtHBCF2WIZVI8UXDP?= =?us-ascii?Q?wLSTL+3Om1cYQdEHW/9M5eSJxCyO6d+0sB3DTYKNYeLml7/9lSMuEkVKbcUK?= =?us-ascii?Q?LPabJ/dWtuX/dWHQ9b7bxrsZ/WsdfQqhHJUMnGUclIw8SAnR1CJm+qjLruuN?= =?us-ascii?Q?T54gaba0leELu4/LpNJU54FxEFAQki5cj0x/66me/Wus+l82gyT+aVhl1jwB?= =?us-ascii?Q?r0il0UXR/rm2IjfZJMJhCXv+s84KVUMCQBxP64NMboiJ8aTaLZG6IcbIh+rN?= =?us-ascii?Q?E8qO2YYeg/BNYHIjmVFbLZ0ZvxNLDmga7ggfIWQxMwQ/11qrJN7NJ4NeqDUp?= =?us-ascii?Q?qQ=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: f884f50f-f14e-4d15-9370-08de2ffd653b X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:10.5761 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oDzNPV035UubhT2E1YsVCelCyQX5pqdbu6mw0aSfDbip8INo/YFZyRWVg/m/iVg/9zMDyD84k5JxRHnW/jVMa6wKRkvLLa51ZIcIaUrredA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" The MUEx50 UART does not fully conform to PORT_16550A or other standard UART configurations. This patch introduces a new UART configuration to accurately represent the MUEx50 hardware capabilities and applies it to Moxa PCIe serial boards. Signed-off-by: Crescent Hsieh s --- drivers/tty/serial/8250/8250_mxpcie.c | 3 ++- drivers/tty/serial/8250/8250_port.c | 8 ++++++++ include/uapi/linux/serial_core.h | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 2e26307a9fee..f38684d11a90 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -207,7 +207,8 @@ static int mxpcie8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.dev =3D &pdev->dev; up.port.irq =3D pdev->irq; up.port.uartclk =3D MOXA_PUART_BASE_BAUD * 16; - up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; + up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ | UPF= _FIXED_TYPE; + up.port.type =3D PORT_MUEX50; =20 for (i =3D 0; i < num_ports; i++) { if (mxpcie8250_setup(pdev, priv, &up, i)) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 7d022315b3aa..38825bb80749 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -327,6 +327,14 @@ static const struct serial8250_config uart_config[] = =3D { .rxtrig_bytes =3D {1, 4, 8, 14}, .flags =3D UART_CAP_FIFO, }, + [PORT_MUEX50] =3D { + .name =3D "Moxa MUEx50 UART", + .fifo_size =3D 128, + .tx_loadsz =3D 128, + .fcr =3D UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, + .rxtrig_bytes =3D {15, 31, 63, 111}, + .flags =3D UART_CAP_FIFO, + }, }; =20 /* Uart divisor latch read */ diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_c= ore.h index 49c2fcb2e24c..9410402721e4 100644 --- a/include/uapi/linux/serial_core.h +++ b/include/uapi/linux/serial_core.h @@ -103,6 +103,9 @@ /* Moxa MU860 UART */ #define PORT_MU860 65 =20 +/* Moxa MUEx50 UART */ +#define PORT_MUEX50 66 + /*Digi jsm */ #define PORT_JSM 69 =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022106.outbound.protection.outlook.com [40.107.75.106]) (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 32F01283FE2; Sun, 30 Nov 2025 10:44:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.106 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499460; cv=fail; b=P91L1R1BYlbuBIfCK2RNaj8PFQt21X002JiX55N5wUiRmd9QVtgZOBZabo8ZcGOZVoTneP4EEPlvBKMghS6PQly4t9CS1fwRjRfyR9DQkDUCZtVeUCJUOWXsnOi5OqsXbXjaafVGWeAqNe/7fTznDRZESAv2zjPH8jXtL+6t0cw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499460; c=relaxed/simple; bh=BZ4lRLiyuoRDX/hmLUroUsCJF73f9wIGMKwviklG3RM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=SjRFVOwESUEAfUvHJVK1PpZlZh2b5/qgKtvFfFqL2TUIGfLftPziyc7vl+YygfV2YG+bH9O4iBHBVp3/NhiWk/pDWL96qHWiOotBdLz5N+/fBd5jIL2OaJcZb9WjjEiEryTx6gL9d/7Mj8q8MsayjqG4hJdeP6f2A6BfZeqqSHY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=POAb4xsm; arc=fail smtp.client-ip=40.107.75.106 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="POAb4xsm" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eIj/w/xMHlSRdl+k3dJ4EXniQJj1Y2oJNdG9NXCVeUHOt8GYli+bqSxCSVyYGVT+gAcf4qZWdjF2EKUnGxcaaM6QmxR7fEfICbH/VEn8bezBVKdksKb4wCZNVugc4uv6TpiD1tKDObXY8o0NKKpFGrG5NidgczghAn+mieojqIIH8lW9YaN+8jOnrm/bcWTRBoILCTKJ8s6xt5aRUXha01XDsMhn6OoG/3l4VqRH11A8juH6iXZx5VqF9IEz2bmCMqInjLzwxjQF2QEb10qSXNY6ZO3QzK8TY4W6cAewCr+S+46zAQ9I+69a8V3peJ+kgQWhDRnUH2D2Hgnf9BPaOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=AxKcuJw1rdZhlJNXpborI08SbZLvyT0qV0oziLHoUng=; b=ZSKEkH1BnC36YKF2sDZ8nhPVyehPBsX6hM6d59SeNMSLbEihFuZGXY52+lG1frDMztxERc1n1pR4fN5XT9QmID3zpKl38GVA2hd/AIyjf7CiDdfOXOyyw+Hdx44ajL4coM8BavgrdQig/NhRJEis6/HvuqMeRxHhyTELBzYYZ3TBp/XyBLvJ6rcZMsmWqDliRBIyETU88Z2ACxT2PuxH9IhaQf8nNM6VTNc/T4unAeMwHRI1cc6F20SBevGxjk/xxNgvGezDfcvXmr3FZjgVmWhXX09s/8G58JsqlxM738zK/R3zwbw2ivKQ/UvE9Q5jYXn5KgQEJshkskJYb2sbbQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AxKcuJw1rdZhlJNXpborI08SbZLvyT0qV0oziLHoUng=; b=POAb4xsm8gU7pCiNRVvX1vzzCOmoGnvUGbpJ5kUgzly7xTXeyL5MBNoDCnf4nzhT9lwvjqhVrjjEbtGD3O0NYEOCSWh6vTBRWwl6myqyjHhnARZHCdVwbBsV4/CF6MUvI8TJ9so6CxhA08fuFurDy/llivpg+KxdwWw19AO4QCU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:16 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:16 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 11/31] serial: 8250_mxpcie: enable enhanced mode and custom FIFO trigger levels Date: Sun, 30 Nov 2025 18:42:02 +0800 Message-ID: <20251130104222.63077-12-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: d7dabe8b-7d4b-4815-6588-08de2ffd68ae X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?lWesbXp00T7h2srEDS6Wx6Ez+K++srnigFsSvMAnGG9TUwEMoDCgWntMuuLE?= =?us-ascii?Q?NIO5Lg8G0VMiaXTrntAv74w4PL6s/TSsBMEN5Vws1S0ua2LugwjLymV2dAOg?= =?us-ascii?Q?TC2h3yWmJHoH8IEXHaXxnsEnzjeDM06OuUsWPKGojMuXQsTeLRaQKX39JV2W?= =?us-ascii?Q?8yj7h9X3WpnWCl3Xw41vkp0+2u6gASogb9OVCHRqkzOD495BV7wWJDWIYSBl?= =?us-ascii?Q?/IDpnqKHcMIMOzWQhbNVgFSgU5fLMb8MviBkcDGM/wKYDUhjJvFT2YHWyE6D?= =?us-ascii?Q?bIwYNshVnaSd7SQ0YWJXSrLxXicK7OAoRUxB+6fPQzPxNC9JO1TBUlESGvUC?= =?us-ascii?Q?45IEXHEBfXrUd9e19fGzla47IDZBhfDsdE8/FzfhVNqx+XkUThetA3N1jeRf?= =?us-ascii?Q?5d4Nf6sTaag8khgjlqMV3DsMx65WH5rE+rBOFkMsTKd391Zyjzg159ea5zdv?= =?us-ascii?Q?U5zLNfODC4Fghkh+oZKFQTIC/u4gKFjH7zM34G6og7pIFdHAwJJ3VQt4jcdV?= =?us-ascii?Q?Mwgm37WXWiKdTuA4+yi9Trt9o09RksdjUw0QoblqP44rb/V9+eWG0JJzD8IO?= =?us-ascii?Q?3PVIt9epD2HyOx3k/W1xYgqOn0l9fqPPNqCwgVFCKw3g7F9yBhq8tggCo6J4?= =?us-ascii?Q?qLM7YZFtfueBy4FeI9DJiYQJss1qkcC1d7QpOcEErwNjl+RrhdGXTxGrSVSi?= =?us-ascii?Q?AaPuYNwd+9hsC20KB2pk37JkiiLX4gqrseza4Wnt+BcySiGHMUN8q8LVy0MS?= =?us-ascii?Q?Bdh9An+Xu7qrYIqCioY4c/zGZDU+MhMUJod1/PpaXR9VllSCs6GzDzOxjGqM?= =?us-ascii?Q?Fxm2XLQl4OwUSAU6CNblUcJwx/AVSp5PJOv8zA/0ZtxyblokDnuLEVFHqV7p?= =?us-ascii?Q?ci3YGMkrC3tMVVN8hHS161b2D9Nhes91yl48BskyduwNupj64fEiTtgEU+YS?= =?us-ascii?Q?y31ZhrdDvyAnLuMXDOtdDvf7RgwH/WSs2JpAqAfbgMCFwOcEXw1ZVwKpKo03?= =?us-ascii?Q?YUvNqJRPjH10/SJQIgYy5Sym8I2TWpGZPQ387tYMF9ckesutHYyuy20OQGDm?= =?us-ascii?Q?TEdBI+czthQLDZ7296J8uvZpc5KD12BNEWPI90EkJyDQAT/3jtfLHPygL78n?= =?us-ascii?Q?eLnSS9r/CoO46OXdJmhKc6zguxiDgh+NRaM0uBPGzJOSGP2mPrqICL6ZLz8e?= =?us-ascii?Q?NxLVD9akae92fCzzuqeI1Gxt55KryCwfOIC1DU8QTYC4zW9CAu94Vg9IHGm/?= =?us-ascii?Q?q482ZgrCFjW0L0g436XVc9EtG+5UDmFAWVqjdSEwT08ClQ44yIxJiME2ixh+?= =?us-ascii?Q?TO8JTJYAQQk6qS+ECJOIP2VQ6/IKaGqcnp0PDxVoTaq5wP+z3BQTHo8Q2Y1x?= =?us-ascii?Q?B14loBQ5N8NcDdDLYSe5tKcOKu7ScL6Ay6F6jiL2jRPpIJo1neGpSqQDPEIt?= =?us-ascii?Q?LhbAyk3U2S1p2OkUXN7C/SbmAgfGqq36kvWRrRBHAOzyMJVkbhe1mg37PHHw?= =?us-ascii?Q?56yT2yiItBOrZxvCZRDuEAf6X6KEhDBGgwpw?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?YwhmkjjFvnE9omrz0pphc+RFGdfRujPKUj3bHoYCC/fhbXT4m6vz1mqfyMPI?= =?us-ascii?Q?5yrDZntblT34w2gcDLFPwFtOCftz4y263OLckBbuyVGm3q59TaiV4vbigTUQ?= =?us-ascii?Q?4X9xtkpI/qk81FL7Hsj56OnEwIJji6ug6QM/CJXXMP0tcZ76HHiuwJaenUF+?= =?us-ascii?Q?vIjysXJ+2GfambcOl6OJXjP5YLo1Pac2EEeBp6iFsopnWc51IRPCG4BENr51?= =?us-ascii?Q?/s9vMMTza2YE8vZAGyHoTzNFjtWj39K4wFA0BupaPKU6BKZ0fGEnUL9794BI?= =?us-ascii?Q?QpihWaCXzZAKxiM1OX9v1VFzcSliZM+2eII0lIOxfH3eFCvJyAdpSk8UY9EE?= =?us-ascii?Q?AYc48r3rcbgS74MOqB0V+y7zRzmRd/ixmDdfKGCS7clh5oNCAB19MZG3BemG?= =?us-ascii?Q?YrC3EtGS4Hzz/CHrM40hK7v7RAA/oCrhx8NeBIoPQLCmLZu9KBazGzlgzVH3?= =?us-ascii?Q?JMBDcmtc3TydryrgOPBLPTB22W/+BpJUhxX36rdBY8Cfwrsw5gINIznX+esm?= =?us-ascii?Q?mzQWYN0fqIxMhMwKxZSw4nCyj1WAe4oH5PZ2Tv7kHkVoLgMjWwUIzCQye+PW?= =?us-ascii?Q?RzK+NZpqH+Ab7itqC/R9cW4yFYSMQFhdECBaYXEUeg+6rKBVu3ia+fLHcDue?= =?us-ascii?Q?XMTflmPIpKLtsUVgf27nCkFukp3nCyFA7mW9Z0+B/MODxeCFSuKeoVo5ZaOK?= =?us-ascii?Q?2dxZyIrARtI/b1RjyGtya7sMhJKXF8/1588qG4SXl7kcFM/izOPFA1c7EwWz?= =?us-ascii?Q?g3z7PU24696L9MC+0024n5NZ041Ce3R5dhJCwMIj+V0sSbT3VRovwnVmgEf0?= =?us-ascii?Q?tC9CLZAFLJZ76KpsIfOM9x0ENOPy7XzfPcksI0WGth2BXlmhBykdeed2aaYW?= =?us-ascii?Q?uV53+EtRucjDLoXGJ7kCZS/cHx1xZ2Yu3z8Pa5nU6E/bfUVXsYA20x0hg4T9?= =?us-ascii?Q?dn8I6Unfhu8NgGPK3KuikRz85vNRh4yJI2OFJ+Xhr1s6t3NpUSCcUVZx+jMe?= =?us-ascii?Q?5XGA84T7kxelrjzoksxpUs4nfXC0qNUEJfDG+rzLRWzkjy0mk9qnI/vX0Tks?= =?us-ascii?Q?/sGpgyRQl4HyUj3btG8vc7rTjRVBW1OH2fEKAOtGemEXaPCfsU2O5XDd1FWx?= =?us-ascii?Q?d7PLHzH85Xw4jmfaNmSONHHGK59p+Q179oRkFMbPEKNZhs2V27C51BlhXKj4?= =?us-ascii?Q?khrCzUSXCI3pd8OhOKNE8IF/L1Ja1KBUJAK19c1HHAWaSnP26yZhuLQHujr/?= =?us-ascii?Q?f/Y1McXnltbTPIZ3cCcnnC7aRDq9lHqTcOOaCjmqCxCNG67A5t30UuipzZXx?= =?us-ascii?Q?dNGDejpXoqUXvDscPXsIqeHJf5GhrB4QOq/DHyRZktnCNAy9ZdIZKL77TEvt?= =?us-ascii?Q?B6v2RYxf6UoyIK9RmmFxQXg3VYzIcoK4lprftSxkGOkL72RWYsIl6jb8p9Ir?= =?us-ascii?Q?1GF3cwvfLZKnrMn5dH57qSfafx+0wz0f3OheEILAHwj8s5P0nXP/gKMVhRqz?= =?us-ascii?Q?dbRtliBUC2KTDhWawdJ7lXaASfPnBUFA7XpVAzXsjzNQiqeXVS+FdZPDcSYt?= =?us-ascii?Q?XwgXl17QwA8hOO1CmdcHdR9R2vDTi0+SJXchoEv160T+ykl8e/jP336ENHUP?= =?us-ascii?Q?Ew=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: d7dabe8b-7d4b-4815-6588-08de2ffd68ae X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:16.3235 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: wlQxRODKuFzWwTknKzE5/wO4RY2Pyr92cYLBXCzrMLVnW2d5wFJFUc0muPEQABO0yfjsJe4vXTuZVtjKAXwYW86NOHVg/R7iQm8Oo7buMsc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Add support for enabling enhanced mode and configuring custom FIFO trigger levels on Moxa PCIe serial boards. Enhanced mode is activated via EFR[4] and SFR[5], which is required to access special function registers used for advanced features. Once enhanced mode is enabled, custom TX/RX FIFO trigger levels and flow control thresholds are configured through specific registers. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 47 +++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index f38684d11a90..39a178dc0519 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -36,6 +36,19 @@ #define MOXA_PUART_BASE_BAUD 921600 #define MOXA_PUART_OFFSET 0x200 =20 +/* Special Function Register (SFR) */ +#define MOXA_PUART_SFR 0x07 +#define MOXA_PUART_SFR_950 BIT(5) + +/* Enhanced Function Register (EFR) */ +#define MOXA_PUART_EFR 0x0A +#define MOXA_PUART_EFR_ENHANCED BIT(4) + +#define MOXA_PUART_TTL 0x10 /* Tx Interrupt Trigger Level */ +#define MOXA_PUART_RTL 0x11 /* Rx Interrupt Trigger Level */ +#define MOXA_PUART_FCL 0x12 /* Flow Control Low Trigger Level */ +#define MOXA_PUART_FCH 0x13 /* Flow Control High Trigger Level */ + #define MOXA_GPIO_DIRECTION 0x09 #define MOXA_GPIO_OUTPUT 0x0A =20 @@ -124,6 +137,37 @@ static int mxpcie8250_set_interface(struct mxpcie8250 = *priv, return 0; } =20 +static int mxpcie8250_startup(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + int i, ret; + + ret =3D serial8250_do_startup(port); + + for (i =3D 0; i < 5; ++i) + serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); + + serial_out(up, MOXA_PUART_EFR, MOXA_PUART_EFR_ENHANCED); + serial_out(up, MOXA_PUART_SFR, MOXA_PUART_SFR_950); + + serial_out(up, MOXA_PUART_TTL, 0); + serial_out(up, MOXA_PUART_RTL, 96); + serial_out(up, MOXA_PUART_FCL, 16); + serial_out(up, MOXA_PUART_FCH, 110); + + return ret; +} + +static void mxpcie8250_shutdown(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + + serial_out(up, MOXA_PUART_EFR, 0); + serial_out(up, MOXA_PUART_SFR, 0); + + serial8250_do_shutdown(port); +} + static int mxpcie8250_init(struct pci_dev *pdev) { resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); @@ -210,6 +254,9 @@ static int mxpcie8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ | UPF= _FIXED_TYPE; up.port.type =3D PORT_MUEX50; =20 + up.port.startup =3D mxpcie8250_startup; + up.port.shutdown =3D mxpcie8250_shutdown; + for (i =3D 0; i < num_ports; i++) { if (mxpcie8250_setup(pdev, priv, &up, i)) break; --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022118.outbound.protection.outlook.com [40.107.75.118]) (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 29B3427FD4A; Sun, 30 Nov 2025 10:44:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.118 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499467; cv=fail; b=YfZHSqxUhFFCZZNDnKKgJjFD4B5/GnQFrkCx2QkvcvbbpeBor9MzrEIlMOm+NzYKwAi2X/4xrYvaURyu5FFKBTw1epoUwiaRXXrsaMiaXhquiqEgWV4b2OVn7Sr1pRAxbyXoRKkaIoTYgSnmlqPwAt8ZtFGK2CVDnQ2PTAHstNc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499467; c=relaxed/simple; bh=jILPKtlGBiZU2YPh8FmPauMHsw7lTkxtxXMteYn3GnQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=fktbPZxCg7guYqKmgk62Eo9xnGXo31UGCEqmfk1T7d3iqH5xt4f9Nx0KaHLz+HK96epazZG9kLzHJILm3+beAUn8cQkDqx/jfagBfZ2GaUww+ssFEocqaDOVmTqaGf5x4NgBy78mcwKn0unM0Cz+T8P0zvLRKWKSXNR3c9iaw80= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=dRrTWXfX; arc=fail smtp.client-ip=40.107.75.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="dRrTWXfX" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XD+16lhVNZf0TElHYql3Mhy29Bz6rvAIjDIk0ver9Q4ouZhLfWVq2wZ3DWVTeuZiqO8Vw5Rwm507bhgTEtXQvCHFVa2qiMmW8A9ZwYOSbvpCN7RalZZ6Rzm2kVzLgpdhxf8rBhTt3ld1acS34/wTT+i/dlc9WfD+dFoSBek7P97UXZw6DPI9YVjt1kP5JdkOlYu875QE/7llTsWIzZHFsKfHo+Ij8MgGYixJ5z/xbHB4OT7uFVpGk8516umDvMrBzGj0LvrvsjVaOWoZUWyGHN5bQkqIF9nt+JF8Cnpe3mY75I7aboy3310PZmHpJjAdoA9A88VqOiMiierSiTACaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=75pwBaaCCMlTUngx5bSKfm99kyVPjtRYbzwkoMzYs0s=; b=UvUR1B0K1sxPgofdFC0CoDqmNQKhFJ6+Pa92Hq19a2ltomr5p5FDZ64xQrIs5dyf8t9YI1nxlGPp4nGQtWQsQPPDIgdo4c+rJErdqDVU0Lk4r+BfXACTtS0NZSlMW180tkxLT7kske3GEWiGi/Fm0LjN1Gb01OeBzxz0d750M5cByzmyS8KksdJkUaif2RKC2E8iLugf8T+Z/whlmBKXLV+2vmapqZAMfgo1HjT0hDjoiMKsnNMdEqxLuAG2FauYsQTKtLGEMg4gfNzGhAAVhdq4l/vuwsL+dfZvSLOMrat4p/pR599cDJPzzD0mVX7JT26lc2rjKYoXA+WEPvAAyQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=75pwBaaCCMlTUngx5bSKfm99kyVPjtRYbzwkoMzYs0s=; b=dRrTWXfXgFebnfxc9r3m0p2NuxJEzYC+Kryun4lm40LW6ydDwnjR/uRlwK1Mq1eIz2fyatzYvjMo2R7yy301eG0wL7DHNTrbUrc2PZfc7YEZFZwsxGIDYTqEHBoQ4S0C9adZmkbwIxiBRxVa/c21+5BgxLkLYT/gWz7T8gW/YOU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:22 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:22 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 12/31] serial: 8250_mxpcie: enable auto RTS/CTS flow control Date: Sun, 30 Nov 2025 18:42:03 +0800 Message-ID: <20251130104222.63077-13-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: bbfe256e-39fe-46bc-ce93-08de2ffd6c3e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ZWR6+KV3KlGoaOyOj8K0FB0VWKAUlFirItn6HSU+GLL9dmgE/MmeP8YXnmSX?= =?us-ascii?Q?6mHQLrHYlOZWM8WQ/9n/GlD1SSPsemm5D2uij7z5P3u+Nxp8vSLOdhlQHpDO?= =?us-ascii?Q?kUudPOeq1n+nP+TuM7wk5Twwcq/1CLfY0RLo/gzIQWqudVEa3/hgdig822FE?= =?us-ascii?Q?0kqQq1RWmdQo0/cw8VUjdXoSwExOWSZqezuUELXjCvhm9XXnSOdUHx1kfpr7?= =?us-ascii?Q?86FGkSMX0ivGSQk5PCxoE7+9MwkJUM2ojeOMzqYjrevjJUOEZor/xXJWZsA5?= =?us-ascii?Q?wjJtnx/T8b2h0nckhoxBg+X4sA3RbZvQuz0fX1trTbAC6z+kITXZmr2gGx7+?= =?us-ascii?Q?T8s6iRgREjc9QzVau5ESSBcpRPsdEX6eu+/7lW2cS3R1A2eG7XwirTNg1g5i?= =?us-ascii?Q?RHZa7Vx6+AQ8zGI++lxftOL6ZpNXqyLQep5IxTnnRdF4G//vRegP8velpLY3?= =?us-ascii?Q?so2fBzc21VPx+dIA4t6rN+FUC5Yc+O6yYsK3en9nc3x/j//Lrjg5vmRgLtWS?= =?us-ascii?Q?q7fDN3wg3X79BsQUGOuILxyalaBfs+JpiHmH/RmIGs321mRs+wF1AwTP2EcN?= =?us-ascii?Q?zT1nV3AX4m7qGtjrnlejLEarCYrHP4UHohQhaXu90fbn8PhKH4DVgXW6jhvN?= =?us-ascii?Q?eZb+aDfq9lao9TCjGI+9qoSqCS19lWAw2Wnhr8XbFooUr6jh5yb7RT/6A9J3?= =?us-ascii?Q?HLNBPDBovRPs+xU5QHjEBeKRgYBYySGPfFWaAa570f9zNcv+1W7x8wJQld/1?= =?us-ascii?Q?JdMqoUil8bUfAsRd+nHedmkyVxfVtPmjPuIIl/drhKbtd4QoLbDz/PUKQUNx?= =?us-ascii?Q?SzpyRmMH9GDZ+k5wP5VzwfmoOnwy8Tn7rlbdEup9jgOHF1Pbw9/hdqVSdfFF?= =?us-ascii?Q?PgExG6sd0JhngqTCyxxailXzW2+XCiTnS47CCbnUr+G7b7F6kzdQzPmoMeby?= =?us-ascii?Q?mRfvXicwHXCQwMfqEZ7NykHT44hfGPWhs9caWtVflIzMgFFpxwYNOdoGKWPZ?= =?us-ascii?Q?1GizuOAqpEyoOHnRDHk8kTTUa2soz1UUfZlQjv6i3I3U6rwFRQXOaugQeRcH?= =?us-ascii?Q?rI6IF5Wx/NxggsOfeQglxdh7EHq/sSEBoTu6vrLH+UNVqrLq74oRM+1njEvv?= =?us-ascii?Q?kB8zW28aieoX0/oL3lGHndzNpb6SOc9v4myyJWcOeOPbR3upJ6PXIl0NQn8Y?= =?us-ascii?Q?Q84PoXJxcU1ZlhDMmD6lRBcbmyU35LcG4KgNAV/Q1lzy43yAd4PkHg7GXjYm?= =?us-ascii?Q?WCHFsbmcsOGC0pkFsiW48NAwlLPEcS9EvGQZ4AOelPfmXnVzjAlHdjf92WB/?= =?us-ascii?Q?QJkBpEayuwjuDtBvyIHIwEoCVos7WT00JJ+S+BeT9IvHjzLM8ZAx2l5NZEfp?= =?us-ascii?Q?XuS5d259uWXYgATETBT8JlKsFbARiJXrBq1+R12FJA9sbPSbolFS09kS3OXG?= =?us-ascii?Q?jKi5VMlaKB1BHSGkZOZHjq6Ww/bgctqZh/mFbV3x7YluTlxH0JeNQtvizFoR?= =?us-ascii?Q?yh62hO8ER0/KFBGYZo4lmPmp8NHUT9HaYfoi?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Q0DK9V/29/3m06WXbCMyXONk0Xqh6fgc4e6vCi1vKwGMqgm67WOOJlHhXMBC?= =?us-ascii?Q?CSb6wzfO1Ff9dnUpjYekIygnAVNJLi2RBmC7aAvRk18S5WyNIB5/GlEvL4Ci?= =?us-ascii?Q?r+E624N32ePptUmNy3jk79/tCzqIgF7rv3Gaa7kDOQdm+V8KBvuwm2sKFWWb?= =?us-ascii?Q?tgfskA+e2fdI4miCbKuZS2JQRoVvhS4+9v6V6sERV7xaySdD7xVyQJbDsQ64?= =?us-ascii?Q?kvt1DBSSc8h9N284kkBHkpKTrN9ml4TRLmgTJIK8YGRhicNbetJdL13Ej9GT?= =?us-ascii?Q?AYjezEdMtS6zNV429p8i+YTe2g0+mKjGDcqo+YfZkwK+wg6kNQiU6VtXNDda?= =?us-ascii?Q?4aL+BDS/kor7dZZa690CekEYV9wAngm4m3hXgX4sEnmrmQh0QALuH4TBLkhq?= =?us-ascii?Q?fKcg9hAnUmggLnwbk/frP2XK6RNX3PIjxncMwhq/Z3Gq67cm+kjF1Nvs7ahZ?= =?us-ascii?Q?bvoPVtj4YGxdjfYSzkyDwDfZhQJwk6NPlaYq6GfWOo//llHTjMFQU5LcrZRc?= =?us-ascii?Q?eBspSbHxwBG6ngrajKzzFshG2GzdNhWvRIF2PlPTlPVkW5Vb+m56wF5Dbl/x?= =?us-ascii?Q?jth/OTplxh04UoREjRKnAA4hEFaMsrSQ4dAmdia/6newuquLRwALMNGXcprw?= =?us-ascii?Q?xmDYkwOY98hqeRGeFmXEJBx4b45jOJOO4IuGYDoE4ST/h33xPCqNNWnwD6/R?= =?us-ascii?Q?dDUNqiknBhDdhxHmrA1Ba94+HaFC0j7EEGKXptRF4LTwpEq5pImmzI4iyIls?= =?us-ascii?Q?mTNqJBBQkiEA7He1hnQZocs1OI6ZddAYmdnzoSD4kaWK/DFHf7xNj+fyzc31?= =?us-ascii?Q?hhws0ZWMvqrgbtmNtmgmCKpCbCvpzqlxgp1jFT3Y6KBl59vmAHr7j7gNoRVR?= =?us-ascii?Q?q/BERVXVP31jutKKaJDrWd6ZBWaoHVQk3nWqeOk+Y1VS3yHHHWrhfkLTFyHT?= =?us-ascii?Q?4FyaPeWtfG37/RK70bediQoqtktKBTzwYf9qJeVjhx809UKyw4sOnw+PhXmD?= =?us-ascii?Q?AJ5xgcWRBw34QkqlPV0tGkgVrMk5xdUl1RWYeG3T6TJLm2/+2oVx7lhUoOe7?= =?us-ascii?Q?Y02d3uocPbRH+B9h3CAe05gFN1j7XBAxHwz0277JXGUbDs8HQdRtM7g8Z1LC?= =?us-ascii?Q?do1YVol3xUjYpcYVk4z4EFmRi1TYSRUKOtJp5PcFvGXxFFl0StJ2xbRrq/e0?= =?us-ascii?Q?wZzdRsAlJxTDkNRo2XivXH79Cc+rasESfJvVNml8EZeLym9+TwcZ9Jb8J9UA?= =?us-ascii?Q?qbX6gswkyD+aqaHw3dV6f1IDZr6oiBdfcRe+LxBmTfphTn9bmELIW13ZK1xv?= =?us-ascii?Q?4JyedlHjc1M4/dQoPRmnvt+hotQf8TptRxoK5q7fbALQD9bIPzIhnZdCv5Bz?= =?us-ascii?Q?2PvS1fhAsFSoVPmN8j7v+DJnmRd9lQJClFmw7316V9sVi5QIt4x1IowqJ0gj?= =?us-ascii?Q?CYJK7Xy/ps5iZsBReTZb2dqJ979T69keTIlS6DvbAbY+nVZuJ6UJ4G2xodAF?= =?us-ascii?Q?/UA/hlMWGOZ0fI6372g4Qv8LBYQKdB5ahz5a8uUZkSVc0gr+kS1YJzppQjWU?= =?us-ascii?Q?VlsStBemG2/P6vl15DJ/PFNSCaqGkQVlQ8oRHmLtnqJUqKnU3APXrC/wEvXt?= =?us-ascii?Q?bA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: bbfe256e-39fe-46bc-ce93-08de2ffd6c3e X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:22.3615 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 2iHSs2+rmRGq774EsJtw+g5L+Wspgd15feh5nrIz/+l9D8w/rB4+k2jHSlyfwyDK/o7G7lpS+SWzs8aTwvSH9A+MNMsPMW9a/sZubTcFsc8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Implement a custom set_termios() to configure RTS/CTS hardware flow control using the Enhanced Feature Register (EFR). This enables support for automatic RTS/CTS signaling when CRTSCTS is enabled in termios. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 39a178dc0519..197d016354c9 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -43,6 +43,10 @@ /* Enhanced Function Register (EFR) */ #define MOXA_PUART_EFR 0x0A #define MOXA_PUART_EFR_ENHANCED BIT(4) +#define MOXA_PUART_EFR_AUTO_RTS BIT(6) +#define MOXA_PUART_EFR_AUTO_CTS BIT(7) +#define MOXA_PUART_EFR_RX_FLOW_MASK GENMASK(1, 0) +#define MOXA_PUART_EFR_TX_FLOW_MASK GENMASK(3, 2) =20 #define MOXA_PUART_TTL 0x10 /* Tx Interrupt Trigger Level */ #define MOXA_PUART_RTL 0x11 /* Rx Interrupt Trigger Level */ @@ -137,6 +141,29 @@ static int mxpcie8250_set_interface(struct mxpcie8250 = *priv, return 0; } =20 +static void mxpcie8250_set_termios(struct uart_port *port, + struct ktermios *new, + const struct ktermios *old) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + struct tty_struct *tty =3D port->state->port.tty; + unsigned int cflag =3D tty->termios.c_cflag; + u8 efr; + + serial8250_do_set_termios(port, new, old); + + up->port.status &=3D ~(UPSTAT_AUTORTS | UPSTAT_AUTOCTS); + + efr =3D serial_in(up, MOXA_PUART_EFR); + efr &=3D ~(MOXA_PUART_EFR_AUTO_RTS | MOXA_PUART_EFR_AUTO_CTS); + + if (cflag & CRTSCTS) { + efr |=3D (MOXA_PUART_EFR_AUTO_RTS | MOXA_PUART_EFR_AUTO_CTS); + up->port.status |=3D (UPSTAT_AUTORTS | UPSTAT_AUTOCTS); + } + serial_out(up, MOXA_PUART_EFR, efr); +} + static int mxpcie8250_startup(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); @@ -254,6 +281,7 @@ static int mxpcie8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ | UPF= _FIXED_TYPE; up.port.type =3D PORT_MUEX50; =20 + up.port.set_termios =3D mxpcie8250_set_termios; up.port.startup =3D mxpcie8250_startup; up.port.shutdown =3D mxpcie8250_shutdown; =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022111.outbound.protection.outlook.com [40.107.75.111]) (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 EF64828504D; Sun, 30 Nov 2025 10:44:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.111 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499473; cv=fail; b=Rq6hP+vhWIZvVLJ29d2A55scJypYbgX9/XrNlTxjrWGhpsfgYx56TO8i2syxJgblXiNLmvbTouRoOzU24f0FRlAogv3Usy6QPZgHqycW9f9ePcxnmTpIfk78xiICh1CHyAWt/lAIT0KO0oUrbbUWZa38wdMuDobWNA1xK4jPsPY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499473; c=relaxed/simple; bh=AzJ/NEcKOScbA1tI0rQgdIo3DGZ11fT0j5YesWxcqZo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=EmRNzOUOktgQ21SMif9IaEE09CosAYdtxwUFWcdjEyL1+v/Mop9sitxODcK7zH2BRqQM09Tp54XSI16c7IYqEBD/M5e7Xafe3oxKXIxYri0uT4Plri40aSHjEppNIntvmQY4Np2h2Ql2oVPbJoskzYndkzzVV2AxbzaaljVAjQw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=RdLO/LeB; arc=fail smtp.client-ip=40.107.75.111 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="RdLO/LeB" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=EwdUJYr7TaTOaaWEb0LGwvOl8AYFF9J39ZcwMos/cul6tXiZtiXiBg8WjaDq/8hFYLlhofqlRZRecZa8TQ4CCTpbHxVW5pSs0m6Bd5DP5hC97h2xwTD0EFhOHBMyq+JOT0W6T0U1qkqO68latKfqFSvbdjv7KV8z+aJxDYwxmIZ2KrHQM5/PK8ZwfyKZr/sho9doZ1omTykYvvD7Vd+srPTDas+AeGXGzxPe0ZJLANarYIhPHZ97QKZJSoBKgjiCMdWJniZJsJJjp0VS0aV+MBd7RMcUnHru1WTxofLRbLLebx3Y+dBYrV98rMgwLsSyMBuk6UuvKiUBZxcc60THuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=pgEfVglOQ3ykxJq73h+rB4bw+MEaDki9c9hxiBjN2l4=; b=nphrGeq68uiMroUTf5RIzlhUEWfr5KoSlEOlcmthwP2lo5yaeQ1mT9DSIKN9HWpKocw/Y+9ck8gtx32onPnFkjgXbR0tuZuwP59PIjOT3uY0i+mG5hLstPNEP/pWFMaEhiqZmiAhbMesHQGiLEZOX1BLod26HDgepmo6zHyd5gvhgH6PfgTJ1DxWAO2afvY3Juu5MSjpPDuRqAJwCH/R6ERh0+pKcRps49cwhG9vGXQHHAAnk3Sl+SifU8WfPMnSir23wOacmL3CpOtr0BB/KsDBCAhXuZUWj3OcMR1GwICqHwyLpIbVFgq5k7WPUSeI3zN+Xznd2fVO2OhuPf9LIg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pgEfVglOQ3ykxJq73h+rB4bw+MEaDki9c9hxiBjN2l4=; b=RdLO/LeB19XZ2+wpZ/Sjej/MA5NGS63DfoIZGwNkJHJjTN1+ndjc7sg7PwDWAu2dfHjFkykpi0LTC+4xHpOfwOCupxi4U+6qEuqq1qpx9tHFjK1Z6JTyNefmB2cSXdp+9f6Eo+468t5G3fh9vJNmXwQtIKeX+yRBp9xYz6enbLs= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:28 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:27 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 13/31] serial: 8250_mxpcie: enable on-chip software flow control Date: Sun, 30 Nov 2025 18:42:04 +0800 Message-ID: <20251130104222.63077-14-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 9f3eb1b5-c0d1-404f-80c2-08de2ffd6f96 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?rYwhjeJbTmhwLXY8/r71+89w8BoBZfzTm76YEpruqQ+qBjhBTpWqHcTpuX8k?= =?us-ascii?Q?Y8CGvTAoJfui0eMOQfj0vJ+0z1OgPVfKC7kg+wgLdkI8hEqk5FI1xeGEWr3F?= =?us-ascii?Q?ByW9xj3pEHTFRvRdc9rj3hP7roB3NSQMY0+Bq5jsN5xLEQM3QngFJH4nXx8r?= =?us-ascii?Q?Nb3jduxNiHCnv/R8GjccmXAuIpDwB7ZDW0daf1dMMYQU62+JrE0RVRP+aWak?= =?us-ascii?Q?/HNQwJQXsWyBPZzKfI1NsDARPDEFzDhT8XqlxVKzjmWjNKsxaHjxEABlAqHU?= =?us-ascii?Q?h1/zOBwPH8gy2fJ/utxkUeKf7MpNwUac/vvuBPk2USxbzbESJ2yMjD5o+W6D?= =?us-ascii?Q?/Sepb8PrWzFiHnQU5/dXjEn+mFVPwkbWyN9oPDjAV4MZKGSbChRUcUzX9lOn?= =?us-ascii?Q?a0cpWjeSm9f4JZ/4vyEpScCk4l/JdxYD3PrfJ+9TXUuwEnnzjXP9oyqFhyBk?= =?us-ascii?Q?251aeYMaL7r4/olUk7QgKzm4uQ+OSRK6s1uuvkeRzShO/Mz0hj+Bjq6ZKmoo?= =?us-ascii?Q?NDnFuMmEvewNuKSuF4K/3fVweYsUYWsBy7Mjo80enNHQQpb1dc05SZY70dcC?= =?us-ascii?Q?RH3ZWD8Z0/XSRbFCzWAWQcqfUeiQWWS+Z5mPro2TZH5I2bNm62gaQowN47+H?= =?us-ascii?Q?PuEzu3pFO6qPmVS/GEwivsGjUkSluWXSKIcLnKouzl9uujyKum7HeVIFir73?= =?us-ascii?Q?X5EUXZ1jfHM0Gsf6/Q3duDS39i505y2gquz74PVB4wXIATpf6yIpSxvRM42T?= =?us-ascii?Q?scLQmHYRkZXrMu3T6O4LIwrggSIaS93dwYyi/dVT+s0Edsiu6yQj7kJX2Jkd?= =?us-ascii?Q?6RG/Dch8G61mkukar9xjjcsf7c5SQruEWZpeWSGGQxo7VA4839CqjkyLXcjE?= =?us-ascii?Q?RePFTxal4vN19wABt/ketwdgAtJ5Fb373h6NRk/w4AvEQ/84q9uIj/hve6BO?= =?us-ascii?Q?qbWnQp12L8II9gL1eMOXCggL35WnCpgiPpGYbOR23YzP4FSMzc6LHpid0ZoJ?= =?us-ascii?Q?R93txA1nbY7NrHVGkFAv7DeoVGhlZlk+9km07Qv9KaUFpZ4W3KObS4xtoqY8?= =?us-ascii?Q?jtkFDpnEAvfhol18bYFsFTpCdF9zuU+LP594zKSpTe76sw/9IvQauEsMrPws?= =?us-ascii?Q?gDrw0YsAxyeKKfxWUWIvbDAh9UQ1q8Jhyopv12P6l2gW+trrT9KrsgeDOlQB?= =?us-ascii?Q?efff5xQucCL3SZ8R0woxUl4RljmhhVldGMBkuSZ9FM6D4KFoBPtD5ysrv3MD?= =?us-ascii?Q?/JYAvL25Cc066SxSbu2Zfkj73JdL89qv3UUTahFSExycvasuuQOPMrn9AOXr?= =?us-ascii?Q?e+xfjqJ/5ZygcPSWMxVtHqN79005XqGlHSlGoOZyeNKiQYFZsc8TwXShytMv?= =?us-ascii?Q?1Mw5+5zDWbS2CBEt2096yG765kbDskbQkthsCh8BBi+mTJoQxWNVWlH4dkhI?= =?us-ascii?Q?9RZ3znyi9zmaDfcb3ONRebXXNaJuiSJDQJFtAJLFWwYzwyeGnRqCqZbA/i7X?= =?us-ascii?Q?5BQuYkp8N0Wzw4vhHq2w/cVY/RCltqLRrKcJ?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?oKd7GD1+sXxbYPn6NpOkrZUEp4+rdP4K3aMkwPVrRbLHjRGRH4a9cfVAI84V?= =?us-ascii?Q?BVFcf0oD9y+OIFvf3QMrTtnOHmHqXAOv2TCPtQeTVvmRBrY9E2X2fHeYXoSL?= =?us-ascii?Q?mje/dv7sp//p4wN3xCVr9/JWU/b1d4auhcCgjfpNjcMCDUuwpIiHYxsrpQMp?= =?us-ascii?Q?VlfbJMff62UbXPcrqq5N1gClGTuOMSnvXVrm+cZvn1nUzdIHNg4J/hD9WumG?= =?us-ascii?Q?f2aUKUTLGy2yBQCVazXNG+AoKKbFUbDWd6mP9+B6gWQBpw72dunrWIbfYdPC?= =?us-ascii?Q?cLRJNUXdv5tjOKmApeSEyOXyOtAUYbz/vtUS3ie1QSnea4HqnS48OvHjJVmn?= =?us-ascii?Q?u5LO2bN34f233bkFeFqsMZwf38eCRAZ+VLhSx54zZbyDdVx4SrEM3GlAL/Wi?= =?us-ascii?Q?LEp/42GEwC/1B6sVQTL0lwNILL4WF/A+8bhcHBgN2ClKia5Idn5no61MpL9L?= =?us-ascii?Q?wMghWFdTzFKoMpliXzpmfewqj0rvZMwJRPe0sjszKiVSIMa5ziPJZCGllmiG?= =?us-ascii?Q?HOrgOxwtaE2yY+lwH6MGj9XxLLD5hvjlCtDWUKf9f1YyoZ4OeU6YvcMRSSyJ?= =?us-ascii?Q?vNGqqEeNAG/yBMyK2vfGNU9566dWgOPogui+YTZMIVD4n+r3L7lRQsjK8ORy?= =?us-ascii?Q?cTGo4aH2uHGhhsJJL2ZEuFYYuLBeEMIFulNW6pLIS9L+EqeexCXpUyEu5jcS?= =?us-ascii?Q?TPpywLMvSFvOHZTL2/sC6j8xmpWSH95/MldYf2Ya85lOEU+5FoBz6fYBA0Kc?= =?us-ascii?Q?7uCqQl5aoBM7T7lmhFRK7tIyPHz40KgfvP+4G9mQ0Q0yYKeWtXO52ybj2rgN?= =?us-ascii?Q?qPe4W98bh9uLX/YPpcUmXkMh8xSsSznv0Bqn0vEgW8vu7Q/Qj0t2FTRyZgRf?= =?us-ascii?Q?ZRWz3KCS8bhMXTrAdPJEVFmDKZL03VlTg1zC012Om0Fg5K8xH7WPFXsXNw/S?= =?us-ascii?Q?GD0T7jh/O24L0+dpo2DSBz68+WrF0P52zulPiblBgtIIks3btaDhRtC3my7W?= =?us-ascii?Q?bObSiernYVXn2uPiSLZCbo/Z+cH5iOOVQ+OEiJ1gHqoC9h+ZccqxdtbzyfEV?= =?us-ascii?Q?OJHqoazu7aUdPL/NZFakne6DH0xkZVsujjmnhr5Uenrwd3gUtvCGUCmzUiq0?= =?us-ascii?Q?3uRJh2hSvNbS87lHz2YsvIvrZdnqF+iq1f3GChfu0Ws/Zs+FrY0nRW9DTz3Z?= =?us-ascii?Q?QImJgY7MEz4Hl2vg5uNUIxPHQ+/eFZAYZYVz0M9caRFAD/IL1XIggi/1qEJH?= =?us-ascii?Q?sZY4+O27aAst341g/FT8o1HcnLcVufQbEXLYDFBttZBBPhBNmP8sPT3tg8EB?= =?us-ascii?Q?5mQMK8llcF0+g1EEOk1TWRSfHEl04vccfYywTNafqb7s+TD1vfDov0LW6Nof?= =?us-ascii?Q?vAxy9sf5j2/6QHQBt/ieXu0MOHrZZ1mD2xSeUwpauwZ1UENU8u2PrPPqhHpX?= =?us-ascii?Q?D9wL2H80/ez8gP/ZIlPjo6WckuCAuywMOD0ibP1CzGApAs/4GDxWEBJCs7Sw?= =?us-ascii?Q?Awpqc4AdS3tDqdWdSkCHoBMxOGAdwQs7NeP9jMRJfW9F4YzI6/Weu7LIKRl4?= =?us-ascii?Q?GD90QWnZNqJsR4M+yajLLMurSI8J5Wx6LziaRhtREYwlD4G689ju7oGx21IH?= =?us-ascii?Q?hg=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9f3eb1b5-c0d1-404f-80c2-08de2ffd6f96 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:27.9586 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: q6t+gOAzk9V5prdq665SFedDTXlVxYMk6H6HVbNErdQQkCT+R9MAN5wYbdQFP+QP9kzYvVm1DINjxWkgrSW7W3Q70uTK+u3+MLzDG3e4CsU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Enable on-chip XON/XOFF software flow control via EFR[3:0], and configure XON/XOFF characters using dedicated registers. This patch also implements throttle() and unthrottle() to handle receive pause and resume based on software flow control. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 62 ++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 197d016354c9..ceef6a5e677e 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -41,13 +41,31 @@ #define MOXA_PUART_SFR_950 BIT(5) =20 /* Enhanced Function Register (EFR) */ +/* + * EFR[1:0] - In-Band Receive Flow Control Mode (Compare XON/XOFF): + * 00b (0x00) =3D Disabled + * 01b (0x01) =3D Recognize XON2 & XOFF2 as XOFF character + * 10b (0x02) =3D Recognize XON1 & XOFF1 as XOFF character + * 11b (0x03) =3D Depends on EFR[3:2] + * EFR[3:2] - In-Band Transmit Flow Control Mode (Insert XON/XOFF): + * 00b (0x00) =3D Disabled + * 01b (0x04) =3D Use XON2 & XOFF2 as XOFF character + * 10b (0x08) =3D Use XON1 & XOFF1 as XOFF character + * 11b (0x0C) =3D Reserved + */ #define MOXA_PUART_EFR 0x0A +#define MOXA_PUART_EFR_RX_FLOW 0x02 /* Recognize XON1 & XOFF1 as XOFF cha= racter */ +#define MOXA_PUART_EFR_TX_FLOW 0x08 /* Use XON1 & XOFF1 as XOFF character= */ #define MOXA_PUART_EFR_ENHANCED BIT(4) #define MOXA_PUART_EFR_AUTO_RTS BIT(6) #define MOXA_PUART_EFR_AUTO_CTS BIT(7) #define MOXA_PUART_EFR_RX_FLOW_MASK GENMASK(1, 0) #define MOXA_PUART_EFR_TX_FLOW_MASK GENMASK(3, 2) =20 +#define MOXA_PUART_XON1 0x0B +#define MOXA_PUART_XON2 0x0C +#define MOXA_PUART_XOFF1 0x0D +#define MOXA_PUART_XOFF2 0x0E #define MOXA_PUART_TTL 0x10 /* Tx Interrupt Trigger Level */ #define MOXA_PUART_RTL 0x11 /* Rx Interrupt Trigger Level */ #define MOXA_PUART_FCL 0x12 /* Flow Control Low Trigger Level */ @@ -152,7 +170,7 @@ static void mxpcie8250_set_termios(struct uart_port *po= rt, =20 serial8250_do_set_termios(port, new, old); =20 - up->port.status &=3D ~(UPSTAT_AUTORTS | UPSTAT_AUTOCTS); + up->port.status &=3D ~(UPSTAT_AUTORTS | UPSTAT_AUTOCTS | UPSTAT_AUTOXOFF); =20 efr =3D serial_in(up, MOXA_PUART_EFR); efr &=3D ~(MOXA_PUART_EFR_AUTO_RTS | MOXA_PUART_EFR_AUTO_CTS); @@ -161,6 +179,21 @@ static void mxpcie8250_set_termios(struct uart_port *p= ort, efr |=3D (MOXA_PUART_EFR_AUTO_RTS | MOXA_PUART_EFR_AUTO_CTS); up->port.status |=3D (UPSTAT_AUTORTS | UPSTAT_AUTOCTS); } + /* Set on-chip software flow control character */ + serial_out(up, MOXA_PUART_XON1, START_CHAR(tty)); + serial_out(up, MOXA_PUART_XON2, START_CHAR(tty)); + serial_out(up, MOXA_PUART_XOFF1, STOP_CHAR(tty)); + serial_out(up, MOXA_PUART_XOFF2, STOP_CHAR(tty)); + + efr &=3D ~(MOXA_PUART_EFR_RX_FLOW_MASK | MOXA_PUART_EFR_TX_FLOW_MASK); + + if (I_IXON(tty)) + efr |=3D MOXA_PUART_EFR_RX_FLOW; + + if (I_IXOFF(tty)) { + efr |=3D MOXA_PUART_EFR_TX_FLOW; + up->port.status |=3D UPSTAT_AUTOXOFF; + } serial_out(up, MOXA_PUART_EFR, efr); } =20 @@ -195,6 +228,31 @@ static void mxpcie8250_shutdown(struct uart_port *port) serial8250_do_shutdown(port); } =20 +static void mxpcie8250_throttle(struct uart_port *port) +{ + unsigned long flags; + + uart_port_lock_irqsave(port, &flags); + + port->ops->stop_rx(port); + + uart_port_unlock_irqrestore(port, flags); +} + +static void mxpcie8250_unthrottle(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + unsigned long flags; + + uart_port_lock_irqsave(port, &flags); + + up->ier |=3D UART_IER_RLSI | UART_IER_RDI; + port->read_status_mask |=3D UART_LSR_DR; + serial_out(up, UART_IER, up->ier); + + uart_port_unlock_irqrestore(port, flags); +} + static int mxpcie8250_init(struct pci_dev *pdev) { resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); @@ -284,6 +342,8 @@ static int mxpcie8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.set_termios =3D mxpcie8250_set_termios; up.port.startup =3D mxpcie8250_startup; up.port.shutdown =3D mxpcie8250_shutdown; + up.port.throttle =3D mxpcie8250_throttle; + up.port.unthrottle =3D mxpcie8250_unthrottle; =20 for (i =3D 0; i < num_ports; i++) { if (mxpcie8250_setup(pdev, priv, &up, i)) --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022137.outbound.protection.outlook.com [40.107.75.137]) (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 7ED3B27A92D; Sun, 30 Nov 2025 10:44:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.137 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499478; cv=fail; b=gloHnPB+sUmgYbuAZuPpXcV2FHKQTtK7mchOQXZE3Np5oK4/GQqPIjphWI0bzJY8kbJGtK41cScJv5sGLT9J/zH5X6qkXzZ0Lo/Kj2eIQrBWTrDqNjlxOwAfosBE+Jh3TtXps2nIiglgLRfwxa1HAghCCvkYhB9Hy8ofU2Q0tXI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499478; c=relaxed/simple; bh=FULQ7tFrpS98Mn2zVtbb4eQty3I6m1ED0VlHLfGkY/s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=He0JGn6G3umwK8N2dvPPuDa3VdQdrjkRUtYKGhht3L8W16MxU9AIH5mBPxiKn1agko6MOTHb88ojXTXeV6L5X9lFScHxr9Szu+3Accv7ga7hTDLIXvh9WmZ04Pj5xWGkARR+sF3NMH18JuzDPyGRg6MJ0f0N6ahau2Sgg7DSl78= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=YP5y/mba; arc=fail smtp.client-ip=40.107.75.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="YP5y/mba" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KbHcsDWr8u9OxiVk1kJKefLH6H1CvXYqEk7DyjiIIbkG3bJQMa2oHPbsT37LVKsrmeSHs9R9Sos+mAfoHfU0Etzb3f+djYOvavuXgDL+J8K9iQs/imMF5nwL7It0smKD7s+e9Lm09SxaZuRIu9TSX7JyH1Kx/gChP0YexyYtmd1AgcZpDO8S98KMPFRU5H4KQ5+SvmkjJO/Ls7lGPVnNkEZfc0UkavWeOoCIMeLGfV9/TWnTraeVNDsB0ZtYMVhxCE/t8yt/NCkHPm6B+6RkGqT30xAnYmuMQ/uMU0M2CoPI9a5TF3umDt17aMlo9elU0CP3KTIkjjT5JRE3jXIbEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=gd/DE/w6Jph7HPyNqa3v6hxD4hscyu+SBSztKIeLW04=; b=kcAYg99X2a1/kWMR6wyM1jzPxkR1v29zufGcE3hytCSJzEWLD2NeQSf52R0THkzuYRNPTW//5steyYLxn6KgBQaWT4D/ctOGy+sT5VCdmQZghoweYl6AyQys9vsX8RnuYP4eUDh5hrHPlLMDlkZJ3KB1PPUNLxB1ejBq/qZBuQJCmWxcNfahbWSnCHg8K5t9BImdKfQ2t5ZHDEXVq45OL4JFdzJ85Lh0b+W4r4hbayKZS8rdWviEFvM+22YDrhSXQ10+3h3yGjNAHkzhYhbe0fvkClY3hQVIwB8AMljMaMVCyV7wHC9wYW8QPb1qJkcyy+GQow+eDoqIaoRQF3qDHQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gd/DE/w6Jph7HPyNqa3v6hxD4hscyu+SBSztKIeLW04=; b=YP5y/mbagb4q/00KIHmj7urCiYc8oo2UmJ10zSCCvEM+GLKXSObmq3gVc4KD0tLgT/5uVFJglVzERQYqTeNQxVeyTytkISRro/L1Sj3Rm0+7Dr3dZ5D80jrMdfNpEQ75J4KSZ8H8XwQFc+CNOKEjDc8RllICmyM9I/thXkOS1+Y= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:33 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:33 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 14/31] serial: 8250_mxpcie: add custom handle_irq() Date: Sun, 30 Nov 2025 18:42:05 +0800 Message-ID: <20251130104222.63077-15-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: d3a24313-5331-4f0d-d142-08de2ffd72ad X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?2ONS6eKleL81rzX+v1t5kkT/qcH3ClGTzyyv4lHxy9eAPej9BkwuWN3IE17I?= =?us-ascii?Q?Vc5K9xahXt3dSsRGf1C3hPPAamMsMimHOfv+AdfVthhM3gHWrmrTMYHg4fMH?= =?us-ascii?Q?2yTwHbmtpzDiVjf1FPeNqEhgZpLCAq8wUxFWzdThOYEIT0VXcnaZSt7TlJR6?= =?us-ascii?Q?UKpgZVg+r1vwTOsDoOvD01COVIQA3qgeFLvboa30RDNE2l/kAhoRWdKAaaCZ?= =?us-ascii?Q?E6SHfSh8I1v57NIvysHa5ErtV7d+D5w8r5qEnwHeF5sWA4L9F6KbdxjCnsRP?= =?us-ascii?Q?PLZoiJnEsUPJyeINL//52OuYKXGuS+hlIWVxk+5uWcFL2AU1pM3rqjpub15j?= =?us-ascii?Q?N8EXh6uIaPRKMskdrF+QAYuX2y2AlEDK/WATowwt4HqA+hR7+pxQ0mUsZCBy?= =?us-ascii?Q?08xU2RusbmxJL5UUdyMVHgv5YB172ifvwlEOnEy3VVFVXB2ZrOejqBb26C8R?= =?us-ascii?Q?OZW8KgakcYELUIU3yqcfsYWa9E6Co4J2HZHTCqa+yDbEva4jkdVgx2IHH8NF?= =?us-ascii?Q?QMb32PUozzbJVUg6AI2qKj12MM/Rgsy9TI4iAqx8RzuH0BAFsXCEKeYdIGUO?= =?us-ascii?Q?K/7CXp2J48Qi6rKEvDNbNvuif/P4Qmz9BnzfIZ3ZDHJaoEORRLWb4rIITQn+?= =?us-ascii?Q?7SkHxR3bd/yxYbci7rLk3DJhkiNDb/cLtUuVeaMOc1ZXVtOhAKcuJvo3EnG8?= =?us-ascii?Q?H989yYmj4YHaJXbOrGGRZOO5cSsQicTLRex7jVA6ItI2CJgYjMEu7Jho6C0T?= =?us-ascii?Q?LtFU+Z6iPFZHzWUjkhbF//c+KkrmKNbvxSnvNrdpYAsoXkleg4OgJatsyZEQ?= =?us-ascii?Q?2uNmqV8RAgqfkXXjgnMpzVbfpilIpoBQyi330IXBMZC7dIXGTDuzP4yMrhJG?= =?us-ascii?Q?SK6xf4d9Nc0TfFKbrC2Jng1fbXfSR0FCCm5cCEVRo6rPaFCU502qmZyjG9bJ?= =?us-ascii?Q?shaY7Gt27/kYwYZ7DqEGzhhI59KNEX2FTkp+hmge1Ne3cYlaNo5Q6qfP9jIC?= =?us-ascii?Q?mzZuzwiUIv5AVXsSfALmIBiDQOgMCloI8gDXXZqBtfeHnqpyQKyV5cZhNXtV?= =?us-ascii?Q?uNuTpv4fXQXM+5wa2qx69TuGlasxn957ghnt1PKOny4M7JNX3a6/bwyQ2X8J?= =?us-ascii?Q?bh0R8njcVOKUMyhsHINbCnUrHkW1sfVRH71Ag9zfrb9DsA7HFNTJj+yDZTBd?= =?us-ascii?Q?LYgmLfvv8VyW7pBK/nGYqEElbxYqwW45nmfWNb3Ftf0Z3B2iEb4tVZPNw1bL?= =?us-ascii?Q?AIpIPGA0PUq2COuEWseCqkZ+V2eXGsuBeuUPi4NfHUabDTd4YWowE3NfxTzm?= =?us-ascii?Q?iWw1V8rUgiflGHUfOHXoYQmkm9L3AiHqo8ko/yU547RQ/l5UR02Jh6/8/zEY?= =?us-ascii?Q?VnkvQ4/HNomyyrjh4WXmq4ZWuVeNi2EF9uuoiN9TyHrs8YMEuOejC8Db9UDW?= =?us-ascii?Q?hjOGWGI9AC2RdIIQdTTNZTOmsW8+YkFXlykXJCV5YChEq6ZDbQTSCpSKHPNf?= =?us-ascii?Q?9nC1b3F8YqZ6AAUKyL0/THUi0Bbt2fZRtdFh?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?8k/SfjCxCTi14AZvgyxnxmAx7GcxM3htvHRoU5/vobUS5m5zPmAmr36m+RSB?= =?us-ascii?Q?iVW8d0ovkAZt3TgUvA4t61cKLrb5MMeTru1OOSAFgahXRkHSuLxmyoFk/daU?= =?us-ascii?Q?+PXi4GVzbColVDAU/P02+M3cg1jf4SvguANOVLch3fKsjcka9qPOm2sKKgQw?= =?us-ascii?Q?G40IG0URvFAWu8/UCxCYUMoztXDSf/Q/I1Y6QF/A592aMbWRa35bqMMTzM/B?= =?us-ascii?Q?WwJL5LUODMd7Wkw6tXf9WXE/QAFKb+CgJBWl+u1p/71U+qzsnc6lVKeS8Gu9?= =?us-ascii?Q?Z3xCfk2+zrmrvjClAS0bHT+eP9pdcrx9f9noHbIjelPOyKjBsYK/6UYHXIww?= =?us-ascii?Q?KeHtmwAzW9ir4N6NEC9X0oP52Sr7GmmHxvYtXANmEJxzXiCw5ka8UW/ukLFj?= =?us-ascii?Q?ZnSbWwFzv2/ddeH7MbdJWqrKLiaHIRWa6pMajht3ZYA+91hfluzEvO5689I4?= =?us-ascii?Q?LF4xcGZSVu2rYDilxf9sygUOlFRrnyXCab1BXtlhmKOSoOppervI5C4CFwTr?= =?us-ascii?Q?NFF3Cx7hNKSRe6McpFVr/ZCpSEuYdC/Bm5FIfyBx7yTg2LoIisZLFyyc+qEc?= =?us-ascii?Q?XLDzXzm8XRrFrSc1uMOXHAPsTSCWimTOQ3dCjj3JxFJZjfJKZ1Y3E0a7xlpR?= =?us-ascii?Q?YU3Nl/LTPGiY73lrWYYij6t82176OzoOr87DodBSwxipYD0r6PhatelsUvRV?= =?us-ascii?Q?FRh8CBZOOmhQwIBFeZbhpTb3np3o5p+zemkk1J0UiAPr9gZs+kLJrwIkHTNA?= =?us-ascii?Q?WIdcsqSYYdlHH8XKCVrfZ2VrR0fE8nMrkCDkAh9TuAzRpNhoyeIR39URexZS?= =?us-ascii?Q?YjGaq6xjbnQHej0HWR8pwIToxEfPl1i1Dh45B+7F4gBqFtTtwmVCIdJTwk1L?= =?us-ascii?Q?DvLzWXojAedL3/fvqHIom9Xy7QAd7xPpV9X+iQcEc/I8Pks6Pa6v0YvycuWL?= =?us-ascii?Q?QJQxm1P5SQLzVVfXq9PuKdh7ift9GunpMvf5drg0vdPHDuyDJWviwPtdrvfZ?= =?us-ascii?Q?63rs8L1MLHDESnlDQ2rzx5kKTK9cfcjI++LqT8GvxAS9G9PiWb+rHjMvrbM4?= =?us-ascii?Q?Zu9b/SEqJHUR6pKaOmI7olnfc8khphuXXPXt84fIHtHjJkPVujNP1oZI4aW8?= =?us-ascii?Q?RYLqekb2r+U174BtskaauqunPF+fLBFL2tDyJUajx9AzznRYG42qq7J5pQSh?= =?us-ascii?Q?zbN8uIdQEisvXDRM64AgSgNc8Ucbe2DOg7EvxgwBFDfHNMWNyHQgN36L4BBS?= =?us-ascii?Q?PnJ6Z7HljksSGoPHQSM9h5DWKTWMxX/ybqM1Psa2g/13QulR6Ri9VWgsNTNb?= =?us-ascii?Q?q9bnOTdj85Sb0zSgQ5FZ4OQkE9ZWF2m/HdeTia7fRtMUUWSpTE1OtGAN9ncL?= =?us-ascii?Q?UWXspvifN+FGhq1GtTBBq2nlotxs315VRrZ50YdSPTKwL5j8U22DlGKyDYgj?= =?us-ascii?Q?f7o6RHgek5gO+EkfpabiCHX3Ck80RPyRgC3cKRn4V+DTj6PEepG6q5XzlZSV?= =?us-ascii?Q?qm8z1sE73dZPFVUz1fkXTFckOTLXq6Pu6dRq29VId7G/QiY0uplWLbweiGig?= =?us-ascii?Q?Q5baJV9bQF7xITbIi16toCoNR9D0M6O/3tLtXG2Xklrvbrlx+w/a5cecRzAv?= =?us-ascii?Q?rA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: d3a24313-5331-4f0d-d142-08de2ffd72ad X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:33.1466 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: PIqERqyaO5vNB1Al9EoHDnTRve0wazNamFusAgdLIB2r1aRluFYxp1ypiDqRsmEdHzYOatfEBLc8zy7rcJlAaSh4rIZ0B5Q8I775mlV9MfU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Add a custom handle_irq() for 8250_mxpcie based on serial8250_handle_irq(), removing PM wakeup and DMA handling that are not needed. This prepares for future adjustments to RX and TX behavior specific to Moxa MUEx50 UART. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 36 +++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index ceef6a5e677e..fe2906d16d80 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -253,6 +253,41 @@ static void mxpcie8250_unthrottle(struct uart_port *po= rt) uart_port_unlock_irqrestore(port, flags); } =20 +static int mxpcie8250_handle_irq(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + bool skip_rx =3D false; + unsigned long flags; + u16 lsr; + u8 iir; + + iir =3D serial_in(up, UART_IIR); + + if (iir & UART_IIR_NO_INT) + return 0; + + uart_port_lock_irqsave(port, &flags); + + lsr =3D serial_lsr_in(up); + + if (!(lsr & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS)) && + (port->status & (UPSTAT_AUTOCTS | UPSTAT_AUTORTS)) && + !(port->read_status_mask & UART_LSR_DR)) + skip_rx =3D true; + + if (lsr & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) + lsr =3D serial8250_rx_chars(up, lsr); + + serial8250_modem_status(up); + + if ((lsr & UART_LSR_THRE) && (up->ier & UART_IER_THRI)) + serial8250_tx_chars(up); + + uart_unlock_and_check_sysrq_irqrestore(port, flags); + + return 1; +} + static int mxpcie8250_init(struct pci_dev *pdev) { resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); @@ -344,6 +379,7 @@ static int mxpcie8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.shutdown =3D mxpcie8250_shutdown; up.port.throttle =3D mxpcie8250_throttle; up.port.unthrottle =3D mxpcie8250_unthrottle; + up.port.handle_irq =3D mxpcie8250_handle_irq; =20 for (i =3D 0; i < num_ports; i++) { if (mxpcie8250_setup(pdev, priv, &up, i)) --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022096.outbound.protection.outlook.com [40.107.75.96]) (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 51DF328312D; Sun, 30 Nov 2025 10:44:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.96 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499483; cv=fail; b=KJAOPaLqnoZIYLm5fu4z/dqDXSqwa5CUKKZEQp1FlFKJxDVuFzYLLAbSNkfkdXWSj4ZW+Wj4/966Uom9u4eI+ORSJ/Q/903h8/i9ThtteiNfWN/8thtF/4zHpjLcwSU8f4fLrbrap6T803RbUfy3qUtzbB9nJw/cvuGrnXezDQI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499483; c=relaxed/simple; bh=qD6zx5lY1lcloJH9d1ODVVrcQyI+JzlFwIN4L6H/QF8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=qnmgnGGuySovicZi/UOKKKmzQSK6GKLM/EFyWc6iZxrq6z9KZ9OkPE8XA+odd5yDDrUgQToZwwIDClMjMuPUr6yGRzNRzA72q43T3y2XKNXTNy64oEsclqw4o9xy6RihOpDZ+eca97dl2kUAZLPZQcZZDK17dqDV9WHobXHRxbU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=VQF94KLD; arc=fail smtp.client-ip=40.107.75.96 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="VQF94KLD" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=suiZ8Ewpvd523X1bngYFfc48ACeQHXuXahckeIpYL29xkRK90UnX/jSH2OSlfq0K8E/jjnJilrQX+zyWhKiOb2kdtlVNm4ZOfhKN9JVdkSLZkRsjPrHzpdvgzrAokWDiJROX/h3wGwgS6vN/iUCq/ISKuW6abeJsIiX3OuYBwG2TzKL++PF5sWFMWoQFkkb4xUDvsdwsyTsD/9aowHzEHFKZLizLLcKU9NbsVg+kZR5Y5DXhnIH1y1SGRCd14v6r1xbTRpfMc0iZVD9fcJn/WF6x+FnxQknx7CkcsfXKvPFfBU90wTD/k5XFbT5eu0glUEztgBu4eWuQdR0ux7qwfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=HUaWQliZbjqIAYzM9vzMuDOziazWqomsg9aokbRCPhw=; b=VXW5PhyE5vyYqTALhqG/k2r9/zcciesECFVSORd9X7tu81XA70u3LnuWaNh47/0VX+WTwpTy7nHaSzBuUdhgfDwBrCtm4J9bvQYza9tYxXoS4uf4fBz8sdUv3UoJD7i6LWErGk03W1vnAGJzXhGZO3uOy1F8pQG/zOzB0gex1koFWBROXc98bW2VzUVuEOlt4U/krp64v15W9GZMGz2GwWG+PNzwhC9ZuJTcvoD5HXl5YmHAcOHSSUsFZCkoR6QSESE92WrunomRGn+/EsN8jv5kYEpLLNRQJs8NGgPXEPbAclDMy6W5jXxXxyv2BjMB+8Z4AX9K9pGqa6NzsKsMlw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=HUaWQliZbjqIAYzM9vzMuDOziazWqomsg9aokbRCPhw=; b=VQF94KLDHKvVLp0dHKhhluRoc+hZ4bdnTIRxfkWIDCt9po+vG6vMiQWHdHby95gUsip1Q7khLUuhndNdbbrd+z5szAGTeIgAlyWR74cgm0zUA484sCo3qIczqbCj+kUHp6KiKzpSYD5ku0JytTHMJIswaV3Qp+5Y71cdWvi4+hI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by TYZPR01MB4235.apcprd01.prod.exchangelabs.com (2603:1096:400:1c4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:38 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:38 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 15/31] serial: 8250_mxpcie: optimize Rx using memory-mapped FIFO access Date: Sun, 30 Nov 2025 18:42:06 +0800 Message-ID: <20251130104222.63077-16-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|TYZPR01MB4235:EE_ X-MS-Office365-Filtering-Correlation-Id: 5b5998e4-2fed-4e91-da1a-08de2ffd75f7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?BhlQm6K+1TWB4XAYpI9zMGBqaFDjIG5ZJIcjdXH2rXWXBM7guJE1tIeSrcMy?= =?us-ascii?Q?gK1NOMPQ5qB8QFLoCJv12fRrgKGnXoNneANwbCv23G1KBUyfRlDgr5faIPLn?= =?us-ascii?Q?90lTX9QcA9MndDLlLzGXsRdMqr9lVOKI/BElM76vwFuVonSRTVqQAxOiYdF8?= =?us-ascii?Q?vQ0wZGBCFj8AKjdC06CX2JXwRKRKSCDkG9HoeVqo10ZrSmvOw/1752tHhtPH?= =?us-ascii?Q?oOyYAqpT/buRTxG2FhHotQelibMm9G3eqaxTyZwVdi0Mvh7WEWj51Tj1h3pN?= =?us-ascii?Q?in7Tk7qKfeibWm+LktNbZt6UTRSdWdMNjxzQqJv8e3tAgzlmprt9v92DLT7e?= =?us-ascii?Q?pHAziPABFXK80fDHxSj+BjHBnj5AdAaqMLQAjWnd0LfVcNJmrUb5GaFgYhmd?= =?us-ascii?Q?2AtEvX8n9F8xN9hkaUek1Vju9Gc5OG6NUT3y5J7dLBtA9QtDmrWnrO+cgQu8?= =?us-ascii?Q?0LM2x7kMIlACBYJ8a7hyg7khkblKMgb73zP5JLmAS/hLB3/8MgO0XbabYY7c?= =?us-ascii?Q?LbNURoTGQ7P3PVdGqcEm3DlxFl8rS705nk0WcNUgsLCHMgCj4LTo5xPFUyMF?= =?us-ascii?Q?lFAZW0sorKw56+UOHG1mumM8kBoThq4XlufMdvpN+O8gjow3SzwFjPuv+yJb?= =?us-ascii?Q?jRuGOjXlJphz6OmOF7QUstJBpjd53Mt2iS/8uUb3b9ZDgYut+qzJhYu2pO0i?= =?us-ascii?Q?vn2Trrg/dhhajSX7BNShIBkOWdmSa4Q/o5FHsDUmiRnU4Ctd5rXT0KlDucHJ?= =?us-ascii?Q?KWoJNu4fp8j0Qm3G0vYs/spPBC9eQYXnLQWNeDxmgnr1Uxu00HfWLdRlQQTU?= =?us-ascii?Q?l87j5C8mE+98IsY1OvEP13LVv/Zl7rJBR2i9ZPtxuy87RKzub/ic+UtL+lCD?= =?us-ascii?Q?2PRHsQ5LjyaOdvOF4O04WHO4jcXCP9Evu5BdJiHyHVgtqh/63HWFFFJDAizC?= =?us-ascii?Q?G4kRX0JIMjOEUQuDY1ekDq7qcxq/odeKO/rwRp0SkYr8t1U2TWU2kXu82xLn?= =?us-ascii?Q?bCJeA35gabz5kZS0RFlVedW6SWFrkWrDPS/i1Itou3AvwXqBe97/Tb67TnXn?= =?us-ascii?Q?Ua1mjm0U+OiWv8Dng9QnlyYBl7KbxNR4+1i5Kl+aR4HQMyzhKyxlvQp3zBX9?= =?us-ascii?Q?9B3O1hwMm1Am8w90QGROmSG/mcsb/6oIndUV7KZ8v0hKShlOUGGQ9elPPERK?= =?us-ascii?Q?KjGj8LYBj2Rvm8CiohwH91CJo1Lq2suYVxbKnPfVMgly1h0ftoM5OLEAs3c7?= =?us-ascii?Q?m9n8+kCtT51NJZHOOmr3Zk3fS+IhlxxAdQO58LVA9C/IlQna50hh93qC/TlV?= =?us-ascii?Q?efZzIWqtlgOM4SdShPSzp89Qvu9w2oeb7h0K3/uw9Ekgc/B5/RBjs0+hGr1C?= =?us-ascii?Q?C2WrCunVj/vCjOOpkrqKZrH4VAWZiGHKXfH9b40JoXXcmXLj+VslEZxQUSUu?= =?us-ascii?Q?xbRiwSjLMTy34oULRdRh7CSo4E24BeFDwCaavcEj4bXoRZYZ8rWeK0UrdIA/?= =?us-ascii?Q?tP4K9n//Nk6ihC3a4/yEjr7zoXEG8qQGNyLn?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vQyiosywGJhTKQgGuLJ4x6eRnTiITt+0WpHvFWBNJOJ9Bh03tVDcnUHnIejH?= =?us-ascii?Q?7q5G+xaYcaMbmCpfuRJSvG+QuC/jI4lXvTmFikInzL+v6KOMuMf+5hgQcfoS?= =?us-ascii?Q?kRHyv4kqpHMiX3NXMM/SGru/zHK1+36gY2HeCKnME90/nPZ1nqn5PupJ5Mz6?= =?us-ascii?Q?ODgfOC9b3pNIGEkUbOGb2S8HSgzy1Nc8julTxatn2/mBZjBxVZpzSTODiR0M?= =?us-ascii?Q?0/8X7qVXxbANRCrMCMfYNFt23TO6y9y7NYXumFqUP5dB6n1gUdMDP/BI5Q6q?= =?us-ascii?Q?az5W7wLSroUs6OsZSBNo1tT6LXk4qdSoNIQfByCJ4yXabiLMGRwNH9H8QoaH?= =?us-ascii?Q?KGdjBfUK6+7SDe7MbgSoEHEplAVHxvtYKpQLJGUJB0Jkdm14Ke3xYYLLg3dK?= =?us-ascii?Q?xkbd+4S3JQLiXfWM5AIBSSbNgi5+kqQL8PcCt0eofT0UYknlkpYYERnn1FJD?= =?us-ascii?Q?9K00gvvy5aZiceFxUI4xNyJiWcwNfj/aapf3Mso3Sg0s2F1izEzgDfVyKBMO?= =?us-ascii?Q?aFLJ7QYkTa+rx3BPq22R2iHDQVZ6twZGJ8wtrgQIQdKnjKV96OAnwX1dyKzj?= =?us-ascii?Q?SHji9rSE5qbUQPjxSdZyvH41CKSbDdQQG1DQW6l26HttYShidBJqwB8j3Li1?= =?us-ascii?Q?3ur4z0tiAff+gXGWfWaM0lJ1iVZ8pJd3+yvG0Wn2dJ7nylWoybRoIk6tgrft?= =?us-ascii?Q?UxAvwKT1JR4ewvxqwmE4HXT/rc9+VvicG1D6RaXnkx7/Thc7rXwU8C9zI68i?= =?us-ascii?Q?uL5vSwdEahExie/nIgTGt8W8TI/ITU6filh/lBP8kqpDY6VokSDqxJqYCJ8n?= =?us-ascii?Q?VjcJZxJ/8c1c0oI/kJ44kWA9BugAHyUCH2DPjlL30tUwxhExPB1L/Fst49wf?= =?us-ascii?Q?1WbUQLGrwQhbphMzB7DEXipgKrbRJA06hluMZtT9aYiHrS9z2amcA0KlY/fS?= =?us-ascii?Q?Wvqc5GczcWdtVCUsCui31J2scPQeORpI+bKjoJiVm1pU0UYtPdoBKqb2vfYI?= =?us-ascii?Q?C1VZPeKZj3UwnBMgtK/XtNG1N7iK0QCAhJZhSKmXGpGXBAB+PrTAx5UTJaNg?= =?us-ascii?Q?4aaz/PfClQFoNNEE0qpvVCQyFPxlhdcjxZ3BbpkJbjuajPLkssXMypp6H1Zn?= =?us-ascii?Q?vj1o3RhlUReo4zmbReLtYsxFSBUjYQd3dmgKmqJvxeXmvszkPKC/daoWbL3k?= =?us-ascii?Q?caaAe77SPVVl/6ZTgeyRDyXvjxT4O3X6nRQoSCPUSJC4Zw9rRQ3P+YvbO/CF?= =?us-ascii?Q?6/ZFwa//QtMR55ERFppYMnl3V+MLyDEYcHtayotjOmOsT8beqjUeKv6lCpwR?= =?us-ascii?Q?rnoppA/xbmm0W+Zqi7MhrlRqakwM4OUAsYuYD+dw07wAeXT512trYFx6s8Sn?= =?us-ascii?Q?57nJIH5SFGNxiFmsrMTKyDvmqU92tJXNyR1Nc+AptVn6u0fvc5VLSYbkpK57?= =?us-ascii?Q?p6bSA1zlOa4DX7NiwuHJ4EitCg8iGUMxLXPL6NQ47+vFH+SAF10tra3rHGmX?= =?us-ascii?Q?m4ugRfg2XiORc2W3sTmd22X3vjHZZ+BA4QFFTzl9KqQEfYmZ7VpKmOFs6E1I?= =?us-ascii?Q?+nFwP6VYk9UsHI1Z2Vt2ny60TP6taQNQAosQvD1h1lHr8clRmtRWBhpHEGmS?= =?us-ascii?Q?5A=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5b5998e4-2fed-4e91-da1a-08de2ffd75f7 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:38.6734 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: +TgGiMku51iuv3p/6W1ukmI8c8pnvXVm2xB0eP3d2dXowL2wi1HfXkBaIxNtgie0cA2jdmmDWa98uMGGFQ8YPJRPYnR7y7EAFzESZWe5fLo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR01MB4235 Content-Type: text/plain; charset="utf-8" Add mxpcie8250_rx_chars() to retrieve data from the Rx FIFO via memory-mapped FIFO access, using the UART-specific FIFO byte counter and FIFO memory region. This avoids per-byte I/O reads through serial_in(), improving receive throughput on Moxa PCIe UART devices. For break and error conditions, the handler falls back to serial8250_rx_chars() to retain standard error handling logic. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 37 +++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index fe2906d16d80..cf519960d5d1 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -8,6 +8,7 @@ =20 #include #include +#include #include =20 #include "8250.h" @@ -35,6 +36,7 @@ /* UART */ #define MOXA_PUART_BASE_BAUD 921600 #define MOXA_PUART_OFFSET 0x200 +#define MOXA_PUART_FIFO_SIZE 128 =20 /* Special Function Register (SFR) */ #define MOXA_PUART_SFR 0x07 @@ -70,6 +72,9 @@ #define MOXA_PUART_RTL 0x11 /* Rx Interrupt Trigger Level */ #define MOXA_PUART_FCL 0x12 /* Flow Control Low Trigger Level */ #define MOXA_PUART_FCH 0x13 /* Flow Control High Trigger Level */ +#define MOXA_PUART_RX_FIFO_CNT 0x15 /* Rx FIFO Data Counter */ + +#define MOXA_PUART_RX_FIFO_MEM 0x100 /* Memory Space to Rx FIFO Data Regis= ter */ =20 #define MOXA_GPIO_DIRECTION 0x09 #define MOXA_GPIO_OUTPUT 0x0A @@ -253,6 +258,30 @@ static void mxpcie8250_unthrottle(struct uart_port *po= rt) uart_port_unlock_irqrestore(port, flags); } =20 +static void mxpcie8250_rx_chars(struct uart_8250_port *up) +{ + struct uart_port *port =3D &up->port; + struct tty_port *tport =3D &port->state->port; + int recv_room, gdl, i; + u8 buf[MOXA_PUART_FIFO_SIZE]; + + recv_room =3D tty_buffer_request_room(tport, port->fifosize); + + if (recv_room) { + gdl =3D serial_in(up, MOXA_PUART_RX_FIFO_CNT); + + if (gdl > recv_room) + gdl =3D recv_room; + + for (i =3D 0; i < gdl; ++i) + buf[i] =3D *(port->membase + MOXA_PUART_RX_FIFO_MEM + i); + + port->icount.rx +=3D gdl; + tty_insert_flip_string(tport, buf, gdl); + tty_flip_buffer_push(tport); + } +} + static int mxpcie8250_handle_irq(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); @@ -275,8 +304,12 @@ static int mxpcie8250_handle_irq(struct uart_port *por= t) !(port->read_status_mask & UART_LSR_DR)) skip_rx =3D true; =20 - if (lsr & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) - lsr =3D serial8250_rx_chars(up, lsr); + if (lsr & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) { + if (lsr & UART_LSR_BRK_ERROR_BITS) + lsr =3D serial8250_rx_chars(up, lsr); + else + mxpcie8250_rx_chars(up); + } =20 serial8250_modem_status(up); =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022074.outbound.protection.outlook.com [52.101.126.74]) (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 B8B4C277C8D; Sun, 30 Nov 2025 10:44:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.74 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499492; cv=fail; b=exocaLyFnCPdK2phit6moUFxaYthIKbM/JhVkgIHllnQb3RfztUWjnKOoxHXOZv5mSNXXzVfPlcIYsWJakH3eZ9JcYy68eOliZNPViQSJSW8eKsQ8Xcgziy5bAFf5rtGFw5uJ368WuFE/5bBK11V10F0dFodhyCcLhk32sSoTmY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499492; c=relaxed/simple; bh=+o2d+7O/s9ibiGD/ubtuOhyGLbdwq359hSMjaxfjXAs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=a1OzMH/EvTAOKjLQPgfAPHkDMow+KA7Ggdn11raNayK0q4yIuTZldZ60qVG8jPc9f5e/bDf+4/sq0Sx0qEO8z7gICF3TJvs25j0AJskTt4jkNpfDtmpiOmGUvU2Spe9505GQVdNdvkvYmIJxMzNlhs/T5jm4mwNEQ4een6Kl0q8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=dUbWKCGU; arc=fail smtp.client-ip=52.101.126.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="dUbWKCGU" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=w3sgiR4WB0YY8cns6vV+jFZ2mVIpcFeBuoZF7h42RFN1h5FwWYvbv3mdTVKikytKxtxMRpthRhMkpaBEpzpKuRul56rNRW+IW4+K+qeV7AwHDRBIwtP3KIpHJaPQLnmON922Uvj5TtT2jmjOFHDuH4RejeGiZV+i6TP251IIdQVL3bOtp1LMdysd0Rzt/SG57ZYkD9T55SN5VryBznx9nMaYNffhQu8eWqzkpaqoj3pHyA5yZl41QHXf+soJbfppKbnpC/K4Cq1dERR2udfeA/AJUAX4qJwtlN7WLfjA/w8Nfp5/aKde7OtTRm2bKir9/QQUTaXYdbxTlg6FUXzl2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=nosEr36Z+f86yrzs/Egc69+dWSHoSX3wrThkdJ6Vm5I=; b=VaWTNnqxRzgV+TOgnt0jG5yAUFFBw5ZvDA0nKyr0j3NoUCnsLNoZ1fV/TqKHNBAg8zjInSh0m6/UqClamUh77KEG55x1PoeXgWR3rz64BQzW9bx0Q/Y7ovejydYrP+FCayZbsm2XY/5epwXESZvc8FDxCs+EQGswdTQaSs+4Ht1QbVCMPtX99JvRHPfzKicAKPMmbxAcAN/+7TSDUVe9VnKau/HgaO1h8sN/UseFv0d84aArYHrxOc5Z5QeXjR/R/+GvrkblmgFFTUSRQrir/ZKmZtFZ3RJGwY41g4yFJFHN5FYTFcPAiJRLVz911tvbwsXOBI3zZtUIuqHa0rWU6A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nosEr36Z+f86yrzs/Egc69+dWSHoSX3wrThkdJ6Vm5I=; b=dUbWKCGU9M6GXam68kpA0tpODVxPX0FJXw85KQu7yL/VQspniyixpcdqDEiR7yPWvX1mXCGQQTRYY8ESeruNN2FZVWb+hZWyGBqOCCWmdgUTWuYNB74BUJfxhO0FCUFLXTwgsjCyuN68uL6tZc8LArm1rJTnIkScuROuODa+vv4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:44 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:44 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 16/31] serial: 8250_mxpcie: optimize Tx using memory-mapped FIFO access Date: Sun, 30 Nov 2025 18:42:07 +0800 Message-ID: <20251130104222.63077-17-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 49326138-247e-4e49-1cff-08de2ffd7990 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?0pKckdAki5x36q7TKPt+/nMEsCYFym7FBQQYBU6TR+8bKZ6yAjH6XBbfoC+L?= =?us-ascii?Q?tmdMfy5CQwVMEop0RVbWnxlocFw9bNMrRYB73fqAwgC4EfazeXUsrNG/rzBR?= =?us-ascii?Q?NiDgZ6i+r3QZECY9ZRX++ekT9KZwvyemDChHrYVg8TBLG4y5Ks83Xk6pdEYS?= =?us-ascii?Q?PF63Mp8tdP0c3YyzuJLZ77mgxnOWGYu9j8ZNKvEbfBfzy1NSFMsODqWitQ33?= =?us-ascii?Q?pJie8khSjGKMdQBL2iyYjhdagDCCEchT2O0XmG6mkanK+67qrivuungjsELh?= =?us-ascii?Q?wz6Q9rFjlhIOHzQDFFmQWDbSC6iImx7t6mlSs9oxYxdVOJTq+Rb8pYj3zS9X?= =?us-ascii?Q?G0//ATcoUErYK5iCrbC4MxpEu04nzjRJhueKn0waWAl0lpbYE8rlOmuLcn79?= =?us-ascii?Q?hkBxmMH+0Na/ANlJJqfSuORYrpJl5nTG3eflw4luTDvUSe21JdpRP22qTIcH?= =?us-ascii?Q?URtgUgYDpiFlcgEv0iB22xC36SsOGHFRRATmEbaw7X2A0WkfcMLmVMzRpWsx?= =?us-ascii?Q?dU3bh34jyJPNptxyvYU6mRikwqIxILMBC1rkP/Czof98dLSOtwTAJgy+hMHo?= =?us-ascii?Q?VtFHlhPZXlC1039DbCvaG3aNuWjaMgXd3VQqHE+diRhiEkzrUWvxs3oRRd8s?= =?us-ascii?Q?OBfTT+2Rhgc+5MESvd7+aS/8bsmk8WcJ/oXqY0ExEZlDKmgPy/KWrqRefqR6?= =?us-ascii?Q?5TyS3Joyww9Qak7qsbtWrIdAWnCBgbBIEMQUku2M/4sv02NQh1x5hVJKRN1B?= =?us-ascii?Q?zkapsjPXOLwBgheQY4+mUhkK/y6RksnTRyL6J/zg30T8SmBQLIiypuwbRdxB?= =?us-ascii?Q?Jsl14ZNAnHaRJE2Nf6+tsPq24lIdMD2ePi7wi266Pri2rPisq1W56tJAxFZI?= =?us-ascii?Q?UEVKBMRXBuk7T/ixBKJNc5hJqiXDhEvz1e2fCDRuHgH23kJb0Sr9CwCz12g6?= =?us-ascii?Q?RgCvsYEnsGICUCI2jUeeNE69im/JQiQRfiTphTZCwgsR6eZpBEJELU+7/2pR?= =?us-ascii?Q?Z2nnpbfMizTWcPL3+2h2ZnzxVzvNHL+NSUzOI92KAFMwYYNIVK1HnPmvli+9?= =?us-ascii?Q?K/vcZeYeV0/shVOT8SzDB/nH1lKMAbfqfir4omIAoO6CR82gVXj+LDvgGMyz?= =?us-ascii?Q?0VnfLwFS8T/enD5IX0OhN6Bogrui5BPc5aVa9AZ7WyWlrgnOicXYFyIUUIQb?= =?us-ascii?Q?KVAKr1B9IQVTekE9oT3/wZZQRjIB4AgKIBM8JKUSjGz8oNkH761nkyUeRWVk?= =?us-ascii?Q?31G/U8l/n55PVCoqIcq0RqgdGbYGJbA0VPD+O5hhvmcygUrzD8sd2t/tEd6+?= =?us-ascii?Q?l0sACmZjje9ZBU8J2iOt8IFkWyOyroQh5+ADsdgyXNTtlOclih/3XWqfmuGf?= =?us-ascii?Q?Itp9eT7Vw94RM9ezbYd2+DiL1bUFm9+ywFTzYA8ZZCYQhEK5HWgUg04x9J63?= =?us-ascii?Q?K84pV5LUUHNxBtpA3U8MRnoUuQrxpYWNfCx5r0sF8+xzr640F0s+mnP5YHaK?= =?us-ascii?Q?WiD+e6bMzXtFeIxiLEvECFyai0weTmg1TO+Q?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?93NdljD0oViH2gpRNb5f8EFD55hW7XMdiUd3cCwm2jBo0cuis5ctak8Ld/TU?= =?us-ascii?Q?LNPjYZ1qx4/UQn4unaAg7qXfoP3TzLsRcFqkD/Y5tF7aaXBH5Tjh2cPJ8NoO?= =?us-ascii?Q?+NZmrIbizCioxMUiBre3Leb8lHZCNeORvJIeWsboe272nlmrSdKZTtYjtGDF?= =?us-ascii?Q?A9XZDBAEWITAvY/gTA/u8dhRSVWyzAkwYp1xFH7XXhcc3/lTxk5CyQ292Hh4?= =?us-ascii?Q?4Slw/NVDKpggkmhCz4Fb/5RrG2K4GtwQPFjcPoOR18hEzo6u+TsZrV5DbAu1?= =?us-ascii?Q?+dc42a+KXTRNS0HI0r49Z1kh7A9/bJ3BVAn3I2n+y/ceJkLAxq8YjYdqstXP?= =?us-ascii?Q?AtYxXrc8d5kqiY3z0MrHLzMur7qopufjFmoJ2a39Ng74785aRZugidfzdXI0?= =?us-ascii?Q?/Ks9kTh53PX6Hftr4hzrLo0eXQfUImt8ed0g6PHJ1mxI125oqqU8RdOMnFs4?= =?us-ascii?Q?8FLoap2/6VVEfD00YMiLzcRQcVIkNL6Kis4exMSEG8gFr5zVPVyaRgCjCTr8?= =?us-ascii?Q?hSWN0g3NieKG0GGULBt7zDQ4MupqzCrMo0Gka+FRTyBby1/2GFmx7egd3gQc?= =?us-ascii?Q?U64umP+TCmxy5TZK6HvuLydfF2GTvh1m76ypnwsoVo6V7pE62ml2hKNptNwD?= =?us-ascii?Q?Qf9ihDgBgU1fOS+5siMzQD23Ni0WmGm0AcuAQkHL4KiDTdQGHc2kInG7W1Bq?= =?us-ascii?Q?WxmJGYTV1gRfCKg+IDemvYEKFqkYi1eBHxlqswTbOD4uzMa4SyI89bL8Qj8E?= =?us-ascii?Q?FjKxD45gddhaW0/Ppp6k54AAbeZC9k6TDkvpLlRkYVqo9VjEiIiBSbOiW+41?= =?us-ascii?Q?lEYWg6hkgcBGJt5VtiQarpuHNzecvMt+BN/stl3liIC+KCuIH/yiseoO9VgO?= =?us-ascii?Q?H0glezq4K5fiTZ2PLtSr6eGbo8W84XP71rLoHH+0yq6Kph+7NN8EKvEFl1y1?= =?us-ascii?Q?PptUMK+ZBUS3qaYSPfTKrQxW/XxWmKJP2dgatFJoVH+ZDruD4uW1d/gwvAe+?= =?us-ascii?Q?MeFLtWba+JDh3ECEgI6SB7p1kW6ltPAb5j5JOnYtwRVXs1Yg5rs2kx2/uRRn?= =?us-ascii?Q?xtHaNkwLZz95lpSmY+JL1EyA6wruBGxK1Lw+CAVaNlKRqhc4P55Bf8EXROsg?= =?us-ascii?Q?VZjc3owm/fz2dqSTrmwFb5Oc7dyt6giqoorqCRAA0CusBezWsj6/ZBScw7tY?= =?us-ascii?Q?i7Z4QL4H5VK7kDDT4qtcKA1h2wa42UNR0OLYa5MANFELM0ADldCGn+nC9xbI?= =?us-ascii?Q?Hd25x1b619c9LjUf1Zs7XBy3CinUHzA5bil0540FVb21bZRPlt+03duy8QYz?= =?us-ascii?Q?cUjNqhmy9WhiZWcNcsPBi11/Y5I6H9+hriNZifqoJgRGdUqxFSKwZxw136v/?= =?us-ascii?Q?GBUGPFPYsUzGdePeo+e+vbERs16F9znWL18xSeMB1Apf6NLdZAgYhq351Ag0?= =?us-ascii?Q?2r3IUd/8NRTMOoD88HlsfRdW16XJXVBR4rrRol9Janc4F3rk0n1aTwU4XBtf?= =?us-ascii?Q?vO2WMCjES5wobMuqQyD2VfLFn8bdSx+VRVQ5XRDe0aIKQO9kUnVBYPJVpR+l?= =?us-ascii?Q?LjGW1RaYnhQlkz6VopFSsUcTFEhv+vy817NGLneiTeDWwUTI0oYekKSEKeU4?= =?us-ascii?Q?yQ=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 49326138-247e-4e49-1cff-08de2ffd7990 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:44.6542 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: h3bM6U5VTxEd49u+G4QyOsswqBV6V/i3wSYgtCc8VzNMOdk9lyH/X+VKPRBr0C6sxehjK6FCf9mAKGzLfkQH9UEm31TZKLK9+/k7mB60vNY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Add mxpcie8250_tx_chars() to transmit data via memory-mapped FIFO access, using the UART-specific Tx FIFO counter and buffer region. This replaces serial8250_tx_chars() to reduce per-byte I/O operations and improve transmit throughput on Moxa PCIe UART devices. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 35 ++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index cf519960d5d1..90ce522fe40f 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -73,8 +73,10 @@ #define MOXA_PUART_FCL 0x12 /* Flow Control Low Trigger Level */ #define MOXA_PUART_FCH 0x13 /* Flow Control High Trigger Level */ #define MOXA_PUART_RX_FIFO_CNT 0x15 /* Rx FIFO Data Counter */ +#define MOXA_PUART_TX_FIFO_CNT 0x16 /* Tx FIFO Data Counter */ =20 #define MOXA_PUART_RX_FIFO_MEM 0x100 /* Memory Space to Rx FIFO Data Regis= ter */ +#define MOXA_PUART_TX_FIFO_MEM 0x100 /* Memory Space to Tx FIFO Data Regis= ter */ =20 #define MOXA_GPIO_DIRECTION 0x09 #define MOXA_GPIO_OUTPUT 0x0A @@ -282,6 +284,37 @@ static void mxpcie8250_rx_chars(struct uart_8250_port = *up) } } =20 +static void mxpcie8250_tx_chars(struct uart_8250_port *up) +{ + struct uart_port *port =3D &up->port; + struct tty_port *tport =3D &port->state->port; + unsigned int count, i; + unsigned char c; + + if (port->x_char) { + uart_xchar_out(port, UART_TX); + return; + } + if (uart_tx_stopped(port) || kfifo_is_empty(&tport->xmit_fifo)) { + port->ops->stop_tx(port); + return; + } + count =3D kfifo_len(&tport->xmit_fifo); + count =3D min(count, port->fifosize - serial_in(up, MOXA_PUART_TX_FIFO_CN= T)); + + for (i =3D 0; i < count; ++i) { + if (!uart_fifo_get(port, &c)) + break; + + *(port->membase + MOXA_PUART_TX_FIFO_MEM + i) =3D c; + } + if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS) + uart_write_wakeup(port); + + if (kfifo_is_empty(&tport->xmit_fifo) && !(up->capabilities & UART_CAP_RP= M)) + port->ops->stop_tx(port); +} + static int mxpcie8250_handle_irq(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); @@ -314,7 +347,7 @@ static int mxpcie8250_handle_irq(struct uart_port *port) serial8250_modem_status(up); =20 if ((lsr & UART_LSR_THRE) && (up->ier & UART_IER_THRI)) - serial8250_tx_chars(up); + mxpcie8250_tx_chars(up); =20 uart_unlock_and_check_sysrq_irqrestore(port, flags); =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022101.outbound.protection.outlook.com [40.107.75.101]) (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 03255285CAA; Sun, 30 Nov 2025 10:44:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.101 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499497; cv=fail; b=lbNIOMGrUc7LxNW14C/o5k9djABGSJUKT8rNn04IeYUhRarP0Vgh6j8zsJY/f2a9w6uSwUrQsoJqHwBGE/lx5hnvVI+6sduwdFWsPQekctxi8Xi7jVLdL2yKHlNZKsTb6cfkcGPTLVQAmHBMb1lv22cFz6G8U46j4ZOj+JyaCq0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499497; c=relaxed/simple; bh=FyVt10JMyR8At+ytNqlHW5L2MQgYZ8TicQhQRmDhutI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=JVZl+IWtJYiL12Gf5d+Hee3TAjwlNh/lq7WbV2OA2MiegOpNMxZWcx52Epb3OcYdKNElzyHrCD/sA0+mG6alETQoAX6NqeL44s93idlIFDGLMNnnHO36r/X5KIZsF3yiup3LKzC9qWTkypZ4atHygA9O3U4zmPUrv69PFCUctRE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=KA90oLWP; arc=fail smtp.client-ip=40.107.75.101 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="KA90oLWP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=e/RJ6eGnQ1fHNTIPR8QoMRCoBoG3kp817eOEzses2REkXbowp8jKzWaF6e09fdZCw+odfoh4cLHn0MBUpo7u7ka3uPLvor6xaiQemT+Lr6kc58vD3mr94x3z1yKWaDasYXaVu4ae0RXUaXtiW/QGwYVDxVV+EPhpPl0YzQws8oc/nOPVZOgoh4WUOomvZDco9kGjItmo+neFhlbxrokzjicLFeW0ByIML/JPVm89W3hIzrGqHrlb+wapBVT45ooGFrFlRT4oon30UuntSHO5lC0miOWnvUhRoruklxKb7Cvjd+gFTu/VHwGtXLGz1+D4odga2jICQFssXdl8c070ig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=r8wsN17oUIKdmiSDTDqSnJiAogSkY69ubx1bmG8UOeQ=; b=o+JWeiMWCoGKglATrf6F6iK3Y2GV3f2WFavjH9xHehdHJaZZpNitMCqi1UbAdF3WbjiGA897GseqQsfaJUpOW0ysBFb1F8mU24muVO7k5EinBo78nuVJ3eqUWT2EWBipWpWrCqJlc/wGASwCD6gMadwbWa1Ht1/GKqv4kTrP+m5qgzzpnHpFwLwNlg1SBxEmca+TxNHnQTrQG2YrJQNtPfU1jEjc5/qvEYS4hkX5SYWGt+98b3aX9IKbCUChGdZ5kEn2O13PjKG6rGNxmR9ZxOR4ymZqzZ84rmpSooUrz2JI/GnLa8k7Bq7CZwZxMnOnNEjaAB8pPWkU1awlIGm+iQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=r8wsN17oUIKdmiSDTDqSnJiAogSkY69ubx1bmG8UOeQ=; b=KA90oLWPYM/MjZ2NNxJokCA+xL8e2qilgh9YtHS1gG+qWi1JKvqcAXSTzYJfvno8NF11YVYHW3iKX0Jrvf8e1YxDnnfWlimwclmE2SVOaSGgJpir7hZSvX9kK+wFTMWrTaF3H/l0m0g52JLC3BkeRsbOgTUu3UnACRT2wrDiiM8= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:52 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:52 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 17/31] serial: 8250_mxpcie: enable serial interface switching Date: Sun, 30 Nov 2025 18:42:08 +0800 Message-ID: <20251130104222.63077-18-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 073c6b9f-d9a0-4a4a-72f7-08de2ffd7e41 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ksvIM5IbvMX4Q6go6CKz2gNyj3KjEyJLH4DOq0pvVrk1ZhI9p2Y1LsH/CNk8?= =?us-ascii?Q?xJTxwEoMVm6H31yDPOKu6JUp4b6DNcV9BEr9OCGxaYIpwRLzApJAMZAiiDpo?= =?us-ascii?Q?/CCkXwLtArKL4BFOwVN/ew7fUwRMmStR0SWFzC36F/ecvRz/d5ZRHImJ4/O8?= =?us-ascii?Q?xP7/R2LztqDqR3cZsyCF2JDbM2p9OU4+5Wd+FotJHyuO/7P+/pt22CcLgp3Q?= =?us-ascii?Q?/j8UiFSxNNLnGv4wNebV938AUmOm5teOat8Wkgf6XWkQqxK1R8B3G5WAMaKc?= =?us-ascii?Q?wDPdItMgnMrWV2C6s01GM2GeSemG5eO8PzySLvsTnxxssvVZre1kjrpAdbIg?= =?us-ascii?Q?s/hnMzMNl7QJbeWXyAUZzuw+OalzgD7ASWjahLjdFvIOcg1rtj0kDi/SpgGY?= =?us-ascii?Q?ipPfRR5CoJywvEA8DH3Cj9PxCjgXux/7foNMxlttKrHHjXg1yKXJzo+2Tgpk?= =?us-ascii?Q?pTHAh8odp7rDYI5MQw8Nl+yK7MGcadGV+17mfnavh9g1ZACAw6uO94ZiV/J5?= =?us-ascii?Q?9C3OhX0YMJPbspwhhM1MN0H3e5DoXr01/5QW+5XJrtSwQr7nWL6am1a4LbZt?= =?us-ascii?Q?qIiAZyf+fygVDje9WOtTQ4J3wLK0V4338fohA4sl2pOZFNYdwooCA3ra5BSG?= =?us-ascii?Q?QDkze48HIirk7tlQVqTfG6z2gBMjFVrF7gxP6XMj+MixkIYWe1/UYv6FxUYP?= =?us-ascii?Q?cQso7lP3pulz8vu6uXseyze66bdYzsPmKOcLx0KUjtJO1oDup9cHzXwc5POR?= =?us-ascii?Q?LpFB4xqRxCYMai6laYWhnEPCSVG7G/ImQA/FdE3PXZ9B3HalrVQGtmjhyi91?= =?us-ascii?Q?mP4Ta4IumLUSelM3L4tOSA5G59e8Q8Ldv4Boaa3FxYoyrdisj76zfrW9b8oR?= =?us-ascii?Q?sYZEd2NF6FvWU5Tb6lDmZkTWkDPkFHG3QosplsQ5EVfLkxU3IWEfzvJA4nAm?= =?us-ascii?Q?6bKMf49t/ra2uV4ERY3YPt7i6zUBa3VRWdHkYybofsZ/c7W2MV46FNbqnQy4?= =?us-ascii?Q?+I/wpjiEKhEPDmZstUs5fy/bzaBRaLrHf9Djf0n3PW1Sfs06IvbYDCDL5NXc?= =?us-ascii?Q?MuJpEjkGv7S+7wIu+l8+lDo6Ab6+WzhaOjZ+xUfGrYxJSJiDCZUML/vZj02/?= =?us-ascii?Q?cwt0MZy+ghGEeEQgjbAlgOfCOUrxVmZjr3dAIc5MDmuNqTBni5eb7pzsenaS?= =?us-ascii?Q?9AjhuDyN2ajrdwIkZOOqFi+PgtHLDfBP6xw820CeMTEhmWFzl7x8lY5+f1D2?= =?us-ascii?Q?prmpeeVk8FXX4XHaiyQWRgoTgYofnhV0vdcO1/yn9OJ6oPhxS5jlbSOKU+0N?= =?us-ascii?Q?J3JWQhnsFX8HpuMpf8uqPtNrDiskd5MnfuP+pnaf9+c6+L7c+EcniXdOdiQ3?= =?us-ascii?Q?RdQxjKtKHmuzLq3DGZPlTN200ZYf58JPmpR2ixyuaiDzQT5CavZYAybBunNQ?= =?us-ascii?Q?wG2L1767gj+Obq+oSW581OAOt0iec8jcNugTLto1bEh9puBbL8DZgT2RQP0T?= =?us-ascii?Q?4+hthDVfAEQkjstMuIqwIU1teLYJFgHu1E3l?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?06U231ZObUppvi5z8y3ApGEfA2+NTF0/WhrwBeu6lUKg7AD6IbJZT25UfNII?= =?us-ascii?Q?ZwUqWd2KK5phvWngNawIMGHNEkD3PNYKhdCl3ZsOyBpQ8OYWDql6WcdbW90B?= =?us-ascii?Q?wVQKRYnr9A44E4pSli7m09r82NWb2DRNJRXMug9btxF9ZrNile8xLJhYXMGD?= =?us-ascii?Q?2yCGUeBa2or9OTrTnOk48vygF9uCeDmbj1CoHJcWlRE/ZB6TP8yz41AEHL4A?= =?us-ascii?Q?W30RrS6gEPdUVBCO1B71TfJptAceURr0TLcVewB7fmrKSORl07PPpRNaR2o1?= =?us-ascii?Q?Kgub7eZVULVRZbS9s4bPUX2hRmRXk9xqlB964WJQIwsdRs37zgh5lvQBEZpr?= =?us-ascii?Q?hgmE1rikDv8/OxyWWWBwMlFDCwpuGxmoWSEm8vPWB0Z1eCpBLznM2Vrc3Y4r?= =?us-ascii?Q?mOpSSbRjDbnkPjpwBX9wEeHijeZnbIzHOSO+GqqUQTGIu8fh1nHtaCmAZYu3?= =?us-ascii?Q?RMg0459hxpnE87pezsH4bDYLhXW3/WV8sxkGZn5SkihGdZXZo46VzMDVCBOF?= =?us-ascii?Q?k6UwsczDObVM3QjDO5DHlHfmfZzsKbhic995J6TBxkRWGQml7qV+/hh6JW0H?= =?us-ascii?Q?BuINjDjOT1gIka3mQaGkPEqSDUwaew5gS6dGeEFKZFvXw0/Ku/OtZGGkBJcN?= =?us-ascii?Q?RcDZ+EIXnpWFQtAmyx3c6Z7PExoNTKRaY82cLyExSDPEcCVvE6s5+VE6csXT?= =?us-ascii?Q?b5+pkoaFaWAoxUYDd3+PhdN3PPyrbJlnqQjDdh78OEbMUDqceC92IH75mgXv?= =?us-ascii?Q?+yiZi3tZVmaANUXe5aUtmubFI8mma2ZfabnOa36bEvoxY5JE5WeTNcSC5qAu?= =?us-ascii?Q?jSYG/zkl1nyT9vt0KIRxoZbeMwGNO7A9Xk2q1LTvmi0KkdfumkciKyBZEpO1?= =?us-ascii?Q?19UBd3PV8bPBxO3Ty9rnQtzFuECpoKCteReZnEsCjN1yAQxlDtp/i3bjU8fw?= =?us-ascii?Q?Q+g9neTgXp4mnpZZ/Hclixm1fUwa8DdgIl6jMQGFXptb+LEvTSjXEmY/4Nu3?= =?us-ascii?Q?2Ah5EfXq5e6Gqyn6s7wyos4edoVifOedXfoTtDWMt+cmTYAurr6ewKHBmvuP?= =?us-ascii?Q?UGCj4LeoQ7WfN1KGGifLYwNA7RFh5l2RjZay0Rn1okq3gCQOV6gzQqHlV3OF?= =?us-ascii?Q?gFIURQFAwGQZ8a6d6S3x0w8XuaJZYRdKyh/wPWD+n21SAi8NoQchZtYIST9f?= =?us-ascii?Q?377CtiKeXsbzPcBLcuDARO/Z8ot8L2bx8zz9cR83zRrD8yhGzNDoO2niaCrx?= =?us-ascii?Q?6DAsz63tacrNtRXc7MakbJtdKV4gXoqrUfcewKCifP253iwPpkjRUk6HLEiL?= =?us-ascii?Q?FTUJoebjPzmBMOeJFwcPrNvHSL2CwFti6d9PtxOjUCuCwDm9EBP/6VhnmAWe?= =?us-ascii?Q?BEqyfFPftOqF1+n7cHD6qPuS5KyzQDoMHLHIpjl7/9Q+V4mVyfestj5EeTUk?= =?us-ascii?Q?Z3b0923KwwP5vcsrUwyOECJb7ICVC2LH2CgL8n6lqwZA+szlcKD6oI82FlXo?= =?us-ascii?Q?aSeWP+5AfoKTDAqaxi5f0j8GGrORXDqQdUNP91fwr3Wdkd/e6ztlXcUsm03V?= =?us-ascii?Q?xkI0/kCh9b+gSGWxg7c9zcOMDPkjXK/uK4mqszDhnDKHUwrqXS67Y5HDYQ7a?= =?us-ascii?Q?3A=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 073c6b9f-d9a0-4a4a-72f7-08de2ffd7e41 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:52.5747 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 4SQsD0EwyhvwAHFOR6Nz7AffXsOVS5EaVOMtcxDzD5biaNqJcAoZz8uYmiEc8wFkRO2A9FijxlsUdQ6wBONi/L46YvzX8rzru4eKiVgWO0U= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Add support for Moxa PCIe multiport serial boards to switch serial interfaces via the ioctl() command "TIOCSRS485" using the following flags in the "serial_rs485" struct: - RS232 =3D (no flags set) - RS422 =3D SER_RS485_ENABLED | SER_RS485_MODE_RS422 - RS485_2W (half-duplex) =3D SER_RS485_ENABLED - RS485_4W (full-duplex) =3D SER_RS485_ENABLED | SER_RS485_RX_DURING_TX This allows users to dynamically configure the serial mode without requiring additional hardware modifications. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 45 +++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 90ce522fe40f..5d1097c166e4 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -105,6 +105,10 @@ enum { MOXA_SUPP_RS485 =3D BIT(2), }; =20 +static const struct serial_rs485 mxpcie8250_rs485_supported =3D { + .flags =3D SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RX_DURIN= G_TX | SER_RS485_MODE_RS422, +}; + static bool mxpcie8250_is_mini_pcie(unsigned short device) { if (device =3D=3D PCI_DEVICE_ID_MOXA_CP102N || @@ -166,6 +170,38 @@ static int mxpcie8250_set_interface(struct mxpcie8250 = *priv, return 0; } =20 +/* + * Moxa PCIe multiport serial boards support switching serial interfaces + * via the ioctl() command "TIOCSRS485". Supported modes and corresponding + * flags in "serial_rs485": + * + * RS232 =3D (no flags set) + * RS422 =3D SER_RS485_ENABLED | SER_RS485_MODE_RS422 + * RS485_2W (half-duplex) =3D SER_RS485_ENABLED + * RS485_4W (full-duplex) =3D SER_RS485_ENABLED | SER_RS485_RX_DURING_TX + */ +static int mxpcie8250_rs485_config(struct uart_port *port, + struct ktermios *termios, + struct serial_rs485 *rs485) +{ + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + u8 mode =3D MOXA_UIR_RS232; + + if (rs485->flags & SER_RS485_ENABLED) { + if (rs485->flags & SER_RS485_MODE_RS422) + mode =3D MOXA_UIR_RS422; + else if (rs485->flags & SER_RS485_RX_DURING_TX) + mode =3D MOXA_UIR_RS485_4W; + else + mode =3D MOXA_UIR_RS485_2W; + } else if (!(priv->supp_rs & MOXA_SUPP_RS232)) { + return -ENODEV; + } + + return mxpcie8250_set_interface(priv, port->port_id, mode); +} + static void mxpcie8250_set_termios(struct uart_port *port, struct ktermios *new, const struct ktermios *old) @@ -392,9 +428,14 @@ static int mxpcie8250_setup(struct pci_dev *pdev, int offset =3D idx * MOXA_PUART_OFFSET; u8 init_mode =3D MOXA_UIR_RS232; =20 - if (!(priv->supp_rs & MOXA_SUPP_RS232)) + if (priv->supp_rs & MOXA_SUPP_RS485) { + up->port.rs485_config =3D mxpcie8250_rs485_config; + up->port.rs485_supported =3D mxpcie8250_rs485_supported; + } + if (!(priv->supp_rs & MOXA_SUPP_RS232)) { init_mode =3D MOXA_UIR_RS422; - + up->port.rs485.flags =3D SER_RS485_ENABLED | SER_RS485_MODE_RS422; + } mxpcie8250_set_interface(priv, idx, init_mode); =20 if (idx =3D=3D 3 && --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from SEYPR02CU001.outbound.protection.outlook.com (mail-koreacentralazon11023126.outbound.protection.outlook.com [40.107.44.126]) (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 3DB1C28727C; Sun, 30 Nov 2025 10:45:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.44.126 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499503; cv=fail; b=VU5v87ivwRSUJW4TC/pjITgc22GBoxKW0DXh/RiyK8XZ9UgNc+Hd2X4iT/QYcqfAJX4GLNl3/Kj+4UOvvN2Pe0B6rfHDC2lXxiNx0CpOm7MyPBnXXHgDNDtWGaJETdhK0b2GVROWDeAGDYQNRrEap7GuZtU338kR4kpSWfsc8cY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499503; c=relaxed/simple; bh=eE7zeiz3MFvb0MaO1X1k6LdFLVZl63Pdm7f4oOKF9nM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=DCnw3Dtp3je9H9qqyf/QtvW5hxq4RI9IdruHHF5pv+114W9rE6odTpewe9Zk8K8Y/s+SuU4wy0MWnU5QtsCVWsjdNcCm7Jyzon8A7pUoKAJEfKITpcwRB5JBjX5TbVCriQBViEn0PTC9F4TMZ9nduAYg1qpUuvA+wMDpJXLDyoc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=fumJpCur; arc=fail smtp.client-ip=40.107.44.126 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="fumJpCur" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=h8Ob4XYVQI9pUNml5Su0bmTkaVssw3CVEECVehTrIiu3rHgUu04T0Bj2KGXPgfKqHm4MLHhzEQmYgi45XKhoZiJBvSPcqYDZmvJINrBusUisccF6S5YVCZqImv6CYruMISFvAvuXx0Kls4lVTFvwsaRXxBUxEDgULDKJiVuvRaeTqYaHvKPvQBNhT/oC1JYfuA/9ZKjzFv5goA+v9ZrQWwFF++MDnteQGF7SWIO+NzpBGhQ0Lrug1UM0BcIRx6+u5WXNBlPqjvLeaMbMYKrI4F4d1JFdlp0YK1AsfhiquClr9Xue9QnSbdRwWb/uSehCZTb9Yw19d7fT3yqB/kNtQw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=pNnc/X6EZQiZXqPJim3ARNYbmSUKCTcpHNQapEZYOHk=; b=FgoeUT210EkECiMFSS7u57vIUesRXGXtyjmdc1RiemMMC7RBl9AgfLNSKb8EzpvoaNOn8z6tJKtmfejvgVTJRs33Z8ev+z3+5AUwyA2nfhoXn2yWXSXZtU5MlfrtG7sNrWtgp6hjfiP1ku4Bi/92q9RAjJE4sDtlEpdgkCE8gsS1hd4zWp1PVLolXzGsV1F0nmMfG0Ux69XYOAlLKlcVUC6JvewytyjPx00IPKmmIJvkS0aTVMn7DBMm5LoknyuT4gtggUyBCuzmk2IM/iZtZRky2zfqd6fSbPejuZegHAa9LX2s6cOXEYv47bx4UptCgDUYWh0Uy36Jy5aD7uEcOw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pNnc/X6EZQiZXqPJim3ARNYbmSUKCTcpHNQapEZYOHk=; b=fumJpCuriafA5dvOhKNEvdPk6qUKHhAvbj3dwrOzR9OreyC4YvlTyOv7XtR+z9vi6NS+dcKu7LQzPZ8v93IhD6ypdCim/9VWuhx9IIhTeBW4lc0TvEQztKBQL8d/r6r0F9VGew2wpQ8NaXE1FMJIdZBAuEweet2bU/m8WSCbjJE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:44:58 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:44:58 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 18/31] serial: 8250: allow low-level driver to override break_ctl() Date: Sun, 30 Nov 2025 18:42:09 +0800 Message-ID: <20251130104222.63077-19-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 504c38d3-af71-4afb-0d4c-08de2ffd817b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?T45MTXJ993OEWwD3PKnO6RvXU0f5KGfa2oD1wr9HbxoDFJvzwxjTRzNHFSx3?= =?us-ascii?Q?sPhDujwU1/KboJDByqNKS9vvyCsgdeJ+vl4rCXrJS3dWD3XBQU77yD22s2VS?= =?us-ascii?Q?7YmW0UumazC7+cMkLJLxbAa0m6UuIKGDN6KbLBjugJnXowv7svj3d2HRCvWp?= =?us-ascii?Q?fQLu2Rfu6WcR+scNQaXCMBZSRLW1muT3k3En493iZviET2UOAe3xMHopYJ40?= =?us-ascii?Q?4tZsk9ny115lf32pjsGTdRkTaV18/XbUbUap/j3wbe5sKPeLHbrnq99tzbGS?= =?us-ascii?Q?V6KKXV5S+5SgQ/ZY5xCZ+/bBol21AV3stIO+R+aPtaxjHoo626KRg5DfVkfA?= =?us-ascii?Q?aJ81ebCWqAo+fsNevnSHBe15f3rdzxcVHlWlm1jHOjUFoo+HCrMf2Twsy6Nu?= =?us-ascii?Q?empWhQLBrUugpfdOu+u3vzGQR5Pa3lAww1BpH71nVH/MiAxKW/SkTP44PdDp?= =?us-ascii?Q?Fi70YN2ZpKH9qmbA01kOERuqBODiijl5FjdokcUsi705D+6abRApcc9leaiw?= =?us-ascii?Q?UVJjAWsBkf/0T7VqdO/77X0jOq5U1hG88UpUxlSMCxeXOPBZNpWYr599HjmV?= =?us-ascii?Q?8ZiqzEy+88B9VlNma5ntcwQpZ/oVzuSH6RvIZJ8VUqUTS7ZaFLypMrLIysDx?= =?us-ascii?Q?PTJB5Py6ze17XtPCTpgu2cN5xlTnzefEEWSMJ0G/lCtk7y51tG+rQxneZyxO?= =?us-ascii?Q?Ux3envk4VC4kS7Yg69bnFVqO1R8WL50KYoZg20pjYzm7lAxjGL/5pUY/mxwP?= =?us-ascii?Q?/Jzu3yNp5GPjvCegJ9gG+xOuw6Z5gHj+OY3UiYrAzaw8n8K3XHHgSyF2jmYS?= =?us-ascii?Q?uIu4dVk2aekoE6c8wHRVmwNmPLiwZjgTzODmtZ+qcNNPPNUc5T+Hu+AKcVCs?= =?us-ascii?Q?cKu2/yn0C5L8BV+krcB28UX9/6/HKrdPXn+1cBhsVPGElRLUWan6VQT+xaLb?= =?us-ascii?Q?qUs4KzJNSQW1Evs2jDfY6TAP+qrJenL/6gZyRZ2LGgRYIZqCpBr/jId8xihz?= =?us-ascii?Q?GPF1KIvdJ3EkLvvn61yIL2f0eG/7swuXbDSMZrwfWi2tGB96TtuDGqc0pWh0?= =?us-ascii?Q?mAAu5/9TKf0vBVW6UayeasoJNEnm7T+G2F/2VY4xUTua6Pzx7wPzVE6nJRn+?= =?us-ascii?Q?ohTaePWRQ62yauqJQF3RtDf8prt1fGqS0YRsd9kH/SKJVyz15/urchdAxTCD?= =?us-ascii?Q?1wQ/sCK+DwWRWpQVup8jpp86KPJu+M/2Yuljv6ydJ+vPOfV01VQZB5BBTitZ?= =?us-ascii?Q?ba6h9NY75gnyb/2znD2511k6gpp6leW6D4/gr0xx5jtU4jSpqmvSCVMJGFVX?= =?us-ascii?Q?3DTeJDYuoTU6w1urNqohx1fN5PMAFKAx4pFjzpXg2zlmvS+oP5RH8sM6vVqU?= =?us-ascii?Q?kk/aOUf0jADTtm5bQr7ghhPniIwGOpZMU/tPfNAVX5jAJEpc4AchgMA0OnAU?= =?us-ascii?Q?z+2EqkbJQD9z4X1x4GQ7V/DEpPkQLbZk9JobL5yihTPg3Xrovy2DLr4boVz+?= =?us-ascii?Q?xdqpBXbjUTeD6agxC1vSnNPRuntzkgzVDhxD?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?/G3d1ZkX/EZd+lAubh8fHkrZax++iw+fGn+DycFfWJljDyjXtoILQB6HW78Z?= =?us-ascii?Q?DkTqN+AkLCSqNOH1BWuNWhbkiL/Xqye4x9MNXgZLVJXZqdQ7ZG3IFSnxgrCa?= =?us-ascii?Q?DIL16L1ySfSyNZKJRU6rnHbwmndng/uIDj6pb9WI0tcDNAexUacJv4hkyc1I?= =?us-ascii?Q?X/Q7mA/Da6GqxzcMiW+ds5Luj4k8G7USuOdVLFXwat9B3w4R+YH27gXEorLs?= =?us-ascii?Q?qX+UqK0nXDSVShhcajuz0437G9SBkvZ9kZKsKw7SjNgFRVuqEbSb8+G4aS2X?= =?us-ascii?Q?bGdqC/KZxbHwuy31A663/EvInueswn1idi627jROqN6fzx9qEsQrzsngl6Ue?= =?us-ascii?Q?e1UOkkyMH/R1GMSIVSeJTBnE9rj/NFz3Js2kUzoOAgOD30f5fVEUZjSv5rgk?= =?us-ascii?Q?ddbTkDR8RX7QLoxosueVi4zKHIF86oIehOhgt3nVou5bj3FckZyxhfDut6Il?= =?us-ascii?Q?fWjEm7WXxGPwf2bhTOcbWSHWJIbcVZEbENkLrmPh+QALOeuiR/CPkzoZGK69?= =?us-ascii?Q?uZNFpNHnAiAkp6DPpFL+ff7pa44aLB8ksQnWVROZ6vLtpzK861gxDyijLf5p?= =?us-ascii?Q?E2Y0XFQSRq1+c7FDkh7hl7QsjOf5cbvyGxtV2jt0OZx8gio5k7uYYP5fz6TS?= =?us-ascii?Q?jPAZ6DZNyGWcWmH6m/0vf1OpsGII/d641PqxuUE3NRsNwKFADKp9DLHI2UAJ?= =?us-ascii?Q?ZIv2bUE0a/+JCV7rMt88pyppimMcvUxRE43u//ZN4sbezMJkkl6AWq3QvIUG?= =?us-ascii?Q?qflDdOc1g3NNRpRwJanNVJ/BJ7Gn61mA5cI+MCGRsizpT3Mh0UnWxEE2GPuL?= =?us-ascii?Q?zI+DxcJ99Yaz+LLv+GRAUf5LTbzx9a0/7kV/ExGt9+LSJhsxBG6sb2aIxbKe?= =?us-ascii?Q?EMBmAsAi644+bn5Hfvo702vO0UpdG+9kTZKcoe2Xnvx5eC9dmTlbXY+m6Dge?= =?us-ascii?Q?Vlyrd833mIyxwaWq7Q7MvDxHj/q1lH0++sydTO4gEg5Z8R8QwMB00UQKMWzm?= =?us-ascii?Q?kBwJRl+K8pbwtJEuMOKHC0H7QZIzhstIt9gRrw018CtJPTh42gGkhnNtRN1K?= =?us-ascii?Q?XraNyedvm1wScIhdllYYu/+m0fgVij7HSYLby+mydaWsEv7GPjXeQiXynWLO?= =?us-ascii?Q?Pf0NT+MvwhkaZyCS5KNIz+M46XlmzHfQ1eID9zX3/fcW7G2f94tyg3TGdAj4?= =?us-ascii?Q?BhF5FAHxkvNaazf2Lr17XIZ9TsP+EqKHaOD/l/S8QrANoSbPoSWkJLZaeujZ?= =?us-ascii?Q?9q3cz9JBN84P01bHQ68V1xWEnkXMjfWv7OHIqCFTH0GiFlGJa7SxeZjxZXoF?= =?us-ascii?Q?EgMWVUliT9ILxXBM8nJ3y8WEXzSOLyjMT/z5pp0x94CLW8OEDJNvP4aT6gcX?= =?us-ascii?Q?7eTTJ98H0DtZUZRigsoQrHtuzjlhLLcrFn/j1wUukyjIAY95Nic6/sUyIvY7?= =?us-ascii?Q?3guLBkwMbWNeJlQQOzgMwIxcRZg0fVy7Bq99MwvzFciwnnEWPgX3hlU+4Idb?= =?us-ascii?Q?7oyZezAWYBE+06qAuwymXD9WUCe+DXzykFJ11F1KS6C0ahqSUGqObQT/1pSp?= =?us-ascii?Q?KF+j8hos4Fx4ubPpW+WhwoIGrX/iw0VuroNHTHpavqmouyVO6XtRXu/+caVA?= =?us-ascii?Q?+A=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 504c38d3-af71-4afb-0d4c-08de2ffd817b X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:44:57.9966 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Ps5WeZr7isK6d8ll/nIt6hNiQY/pafkCUx7UIJOvtHVUutgBPFm/k8eQzKoAlat0m3InniqUttTk1TrkpAUuSM1Q2FMJe89tGTJHZXz6eQg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Moxa PCIe serial boards requires custom break signal transmission under RS485 mdoe. However, the current 8250 driver does not provide a way for low-level driver to override this behavior. This patch introduces a break_ctl() function pointer in struct uart_port, allowing low-level drivers to customize the break signal transmission logic. If no custom implementation is provided, the default serial8250_do_break_ctl() function is used. This ensures that hardware-specific break signaling can be implemented without affecting standard behavior. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_core.c | 2 ++ drivers/tty/serial/8250/8250_port.c | 11 ++++++++++- include/linux/serial_8250.h | 1 + include/linux/serial_core.h | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/= 8250_core.c index 68baf75bdadc..f642e8c77911 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -802,6 +802,8 @@ int serial8250_register_8250_port(const struct uart_825= 0_port *up) uart->port.startup =3D up->port.startup; if (up->port.shutdown) uart->port.shutdown =3D up->port.shutdown; + if (up->port.break_ctl) + uart->port.break_ctl =3D up->port.break_ctl; if (up->port.pm) uart->port.pm =3D up->port.pm; if (up->port.handle_break) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 38825bb80749..64896f37b75d 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -2079,7 +2079,7 @@ static void serial8250_set_mctrl(struct uart_port *po= rt, unsigned int mctrl) serial8250_do_set_mctrl(port, mctrl); } =20 -static void serial8250_break_ctl(struct uart_port *port, int break_state) +void serial8250_do_break_ctl(struct uart_port *port, int break_state) { struct uart_8250_port *up =3D up_to_u8250p(port); unsigned long flags; @@ -2094,6 +2094,15 @@ static void serial8250_break_ctl(struct uart_port *p= ort, int break_state) uart_port_unlock_irqrestore(port, flags); serial8250_rpm_put(up); } +EXPORT_SYMBOL_GPL(serial8250_do_break_ctl); + +static void serial8250_break_ctl(struct uart_port *port, int break_state) +{ + if (port->break_ctl) + port->break_ctl(port, break_state); + else + serial8250_do_break_ctl(port, break_state); +} =20 static void wait_for_lsr(struct uart_8250_port *up, int bits) { diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index e0717c8393d7..88996a3194de 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h @@ -192,6 +192,7 @@ void serial8250_do_shutdown(struct uart_port *port); void serial8250_do_pm(struct uart_port *port, unsigned int state, unsigned int oldstate); void serial8250_do_set_mctrl(struct uart_port *port, unsigned int mctrl); +void serial8250_do_break_ctl(struct uart_port *port, int break_state); void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud, unsigned int quot); int fsl8250_handle_irq(struct uart_port *port); diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 743b4afaad4c..1aa07c5187d8 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -451,6 +451,7 @@ struct uart_port { void (*shutdown)(struct uart_port *port); void (*throttle)(struct uart_port *port); void (*unthrottle)(struct uart_port *port); + void (*break_ctl)(struct uart_port *port, int break_state); int (*handle_irq)(struct uart_port *); void (*pm)(struct uart_port *, unsigned int state, unsigned int old); --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYDPR03CU002.outbound.protection.outlook.com (mail-japaneastazon11023084.outbound.protection.outlook.com [52.101.127.84]) (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 CF2B3288C81; Sun, 30 Nov 2025 10:45:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.127.84 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499510; cv=fail; b=IwFJg5gtMJxoh/MIDgC/Daw5bU+yj5k+E2OLax2uJ1GAW6eKYCtUUPg0uGXp9gAHzt2Y7D2TeUL90r/4ENJf5HjPPlNJAY49wFMg8c3kO97xJPEvUcyoj1mKHRDfYyXI7XDl4XiICXhjKMl1gcR/Xb09hkYuxcJ34sviHjVAO24= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499510; c=relaxed/simple; bh=EIqt1OdsmnnHAzs1p5St5ovJkPHV5r1WK1bbdiG/1NI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=OKfYRVTL4vAnhvwXy8iNLOrAhpTIz0Jte57m+HfQDupVsUYKUMdpk/en9HSua1pm+UY+Cf5PzZF8DHCjNr7ZPSraoZWh1bnf+QBq1rFg1ApCHHiE4UWWzfq27TU909cZKPKP5j4Uxs14Fnh0Cbgc4SFkf59FIYrAqMkj5KZhbnc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=I2cFR1qF; arc=fail smtp.client-ip=52.101.127.84 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="I2cFR1qF" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=e4ueHDWdikVZNE8mncSfQKRtwNr3ABK3J8qalFru128Mhj0r/q/vO9ZjLrGYNQ2GbH/GI/Yy0lpZVirc/qyOR8LhIgOkkthk/qk31J148vrbep9UEnQkTQUO/NuhyUIV0Ho18Cgn3buKNHCspQh9bVnrYW28lyfI6QFDnd9jc3yNl9qKgemEU920rG7U2IKePnd9IzIQkD8T5D5TAkD3sVHw1GeK+vuwsrbJS5Jkavz5KvIBLRpLRr5t1dvs9SOCVUqF5PMp78AX8pFcNV2akErJBPpHY6QEfGM90ttqBOxjmhu0fjCIErEGcEjzLsyyVV+MhKGb6ImMwx4/GulIYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=tRLjzL7E/KFjE9zvRrWx/9NMf0yh4xqN0r4HJ37+NNw=; b=DuWHT4GRYDn52fuM6EUiHa5PAb+3rexzJqzk94r7yPUiK6LnVgPNNTn0cCT7dPKT6PzZ3m0uuJ/ov+gG+B85qwUb8XOlHwsvBm8e0MuuPzo7HToKlj2gbc3t1XFGOrRNakOSubokNb16u3I9R2mkqNzFwI6k72Dn8UuNcDu9Ox2CydVsAmXhEszVbIKQ8SwkKAI+/N8c5pLja7yr19UXSWU1sfss+JuFYeXeB2zkKAWuqAG3C75cnH+MkfQFOfogSZdiHFOmGz/nGQI5gyb/FeJnkuD679fTyPqx3qRjQ58qykIbu7bnNoVcn6u4++/cE8MH7GyxAp3Rf9m8k9ubYA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tRLjzL7E/KFjE9zvRrWx/9NMf0yh4xqN0r4HJ37+NNw=; b=I2cFR1qFEm7Jv/+7JTVjEda2Gg+Uv6JHKFufo0J5kCzW7EoP0UpwreOQlSeyyfWWp1W35Sq/MAwSPy8BE7NpfSCtKFvRz/w5RwFbX715XO7T4QA/5UZdw5pV/n9L9mmynk1fUJQpeQFQXvEqQK+D/6NLbYVqlWBbdd6pqAwCJ7Y= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:03 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:03 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 19/31] serial: 8250_mxpcie: add break signal support under RS485 Date: Sun, 30 Nov 2025 18:42:10 +0800 Message-ID: <20251130104222.63077-20-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 8de18c95-0c6f-4831-4008-08de2ffd848f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?RaoSjbqQ+s3fMZkhVxal7aQ04V3YkJrAyWWsdUDA/7GxT6aGcBquecxDOk2p?= =?us-ascii?Q?F+h4xO8YzrZe6fh4/WQO7+WyL1ggo7ptbIHuNbLTjecKX59tYNgCng2ZGpqf?= =?us-ascii?Q?GPoVdsREU8lXTF3tX7Q06CPt17eiue6GjN+uAqciyu64mq5jC/va8irsAsnG?= =?us-ascii?Q?i7CrlMmUWz6bYbsH90GEkzDJdDU1HjOLm1RCPS61lBclcSYX9U8cZqkKVEpc?= =?us-ascii?Q?TzDaGt+Evb8DsxbV5Dl5uq5Tcpq/yNq2Q7QY7jpxWN3Zt8QhTHAHNiD6wtjK?= =?us-ascii?Q?8XkK7HFezkjYkb/j82nRpK29OLOLNqA+LPRS2YO8724g23nzwI/YL9DVwwqb?= =?us-ascii?Q?EgfgRdCB3ivznuk3ktr8/BJVusB6P04nSrixUsROyNwoWhwjGB/maz8Z5ShD?= =?us-ascii?Q?zUB/fMjbQgYBmDQ8T9qhdLQdL6Ep5mko8QkRTnrN5FAFh5Iwpommf3UpCgCf?= =?us-ascii?Q?V4pHVMQw50x2kzfyfgrU11TTC8CYaHPVSk3pDEMIlccq24fja6oKtZLkkvIN?= =?us-ascii?Q?pgksE5b1zXOudak50ZFyS/mGw6QALvNHKw1PEWrTumvyjbtEdKhYuykuzJii?= =?us-ascii?Q?5/T/CYsxa/zFnV0GAelsOfrjI61PlWlvKL1q+zOqvohLkIyahz4r21SSE4Tw?= =?us-ascii?Q?LWyqtmr0vngvHbJngIjuvCqhUmcUCiZ9HTl7iUAchLwJDhSc6tbn+NHlmmew?= =?us-ascii?Q?YMCsgzBhHAfyJ4w2uxNIQYdh8GO+QwL1HCjoB3Ie0zRmIRgqezFkyjuARq8W?= =?us-ascii?Q?dcmPauUrLUVtXjx1LB24QHdAyQw7pZSsvLrLhPH4FGYYr/513xiLYRbv8Q8c?= =?us-ascii?Q?q+xc961yJa3ghauL2C8PgYx/MDZE7C09C5yYWRFYoxPna20m9+QLRpjFsLwP?= =?us-ascii?Q?DCHJnUK5YfK4JXma4Wsf2SKGXo8myMpcZwr4mNNLjtKm6MpJtyudJ6b8ygDL?= =?us-ascii?Q?kisNUqz1MFEnHzrr70nK+wVsKwRiAt9r/p8nJloHdTxjA1ZxKquezJFSzPIg?= =?us-ascii?Q?7e0ZMdAuD8NoJxYhzTGQv33waPfRxQA0fQCVVQpImAlrp+Yyze820vDc9wkG?= =?us-ascii?Q?Xdd01gWsM26TZSMB6XigiVWrKQob7kP1uibuEceByXFmOWoZMvaBn/Mt5uej?= =?us-ascii?Q?qVSk4R1S67GaZz3h6ALCI79SH4xrs7581Mb8vKQvrKu+EZhdY06Xx5eHq9h8?= =?us-ascii?Q?sG4dD4wiYm5j8jzbGyMbYJCidzTQ9E4wnKwFAKo/zF1thr62JOO1U0GGj4Us?= =?us-ascii?Q?f04jD5wYYVZkBoax7lBQojMiVzWlteRxTTPCiuYuuJPcGng+7wFuv94F4eQ3?= =?us-ascii?Q?vUFKtTk5Fnp1HdoVBwoCqPrq5RE6gCFR9kB9E0rNWzMKR2UEu3CLFe8alk0q?= =?us-ascii?Q?UXGY37Pd8XCqYluucGiNOV+jnvCqnqjFGUwoGrGBhbFDXo6q/mOED9GMJHcU?= =?us-ascii?Q?Y8VfxYlmxnytEJTYfv0HhBulloPgvm3D/yV/RRfAy4GDXESQp1+SszD42ErA?= =?us-ascii?Q?d29xAxQKeEYJWGVHPGaGIfkgOQPGQVGbLWcK?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KQXmULUxyjlX4Po/xoXLQKiOL8wQh6eER7yQXzRigm/PvTTMjBH1snSM+WHV?= =?us-ascii?Q?3DJrwHllY+o7yfcZ7hecqiNVGTQ1WhkrKwovwUynh1ot/V4WtKe+ILbnXF5t?= =?us-ascii?Q?9j3u8TERzCVSHvROXRVQgnsM1/GTGBIFQjB8CZ258xWdpx/IorRCnj2oVcZx?= =?us-ascii?Q?Y7xvv0VolcZgHtKVuXIrpK7CSyBTU/7B3dFJ8GOSA8ohQ2SmGH3e/Xwc+YkJ?= =?us-ascii?Q?pl+TCGCCe35TAQYHS0HQXPYXTTtY0aLbctFd/SxQGSvhd30Cs3Vy2DTWdV5a?= =?us-ascii?Q?bMKYfWhr6lcMqoxtgVykbIvy30INEc+uqwz7Ad+qWNOarOawIaTXZN0ZFmCO?= =?us-ascii?Q?ysLc7gyLH1PHO1OaHx+N55wuUpFIJN8N6voQOb/X57IgKxkcxO/mONQrBoWf?= =?us-ascii?Q?EbPX7fYkuGiDyvJ2CUxUglOTfcOWIDnsFZPvs9LjKAyU0hx0kW8mlYL/hUlR?= =?us-ascii?Q?qnU+3LPRXSLWiH4Jwvvh/L2/A1x+VLQ6OjKu0FpmFq9AM5LgDEjHoh9O7i8d?= =?us-ascii?Q?4OKaf7AO1tBspX/X11zujuV/UXve7Y+387Xr4H5G8Zhdgiv2r+UYHppHe0EI?= =?us-ascii?Q?/oZ+40QB6a89zvDNqNAm0EJYIWhIn0GBn8FtUGJKUPhN2U90iz1SrOZNJIe7?= =?us-ascii?Q?gSQaEVX8dcES55S7nmewRez6YAXCpQEjsFyw1Yct8HiSDitYNz37whHBV7ed?= =?us-ascii?Q?LSZkmfHMDtD9pcEXkKGDO/CtezIhfC9tk5zNCYHf8BP6CtXIj0qVBSCOkgH4?= =?us-ascii?Q?u/t2c1ky1qNx4jReCRkJFl6uJ1eUhwSGTIRU4984G1pSrRj5K0pYbMTQsroa?= =?us-ascii?Q?be+UR/Ph2y+pDpKaHvysVi++zQTYLMPYwGDsAessG2rdlqjGFFHgJnXG5ABc?= =?us-ascii?Q?VztbfIIZMkMGgZWYRaYEBdOwT3rKcflvB/kteTyfTRa4Q11YvKcV3o5HG0o7?= =?us-ascii?Q?lmQry7NeJ5PagIr+5cB8MgMY/4E1ZTVOf77ztcoUeiw08QRVGVfsfPb2nXSw?= =?us-ascii?Q?hmRPqel7ddC3pFflW3sgDckz1Irfa0xV0+dZ7FGS71ooqJ0lXTjAn9oV1z0j?= =?us-ascii?Q?DdsbroZxlRXPpdju3JHE+B4WRt++245xH3WVyqa/suxcfRYn56CjbBMBYaet?= =?us-ascii?Q?0Ql0qfTobaCcg+1rjdjFVcXFsybWOqFLtH8MMGU2T4ZrPc61JIDOZvRT9YcR?= =?us-ascii?Q?/70JVgU1L9q6m4Ruwfbr/ISoi2V0q13MxoQDsYuB43CoOSl2qMRbkvuv+cV+?= =?us-ascii?Q?cLKt2Db5sGjfXAZciWX8OwbVE99WOMBEXIqWLlTxe1isLBO1O4IsNRm+p0Lp?= =?us-ascii?Q?cEI2vYXhIsrzt6gLmNt0TSo1e6/WZ8n34A2wkGDndCdN8+JBLQ3IkMyLCG8n?= =?us-ascii?Q?zHxwv9dP7aDApMT2aVlJC81qfXa1LnRjtH9f5D96ifRHMIe69t3GeRvpWTVl?= =?us-ascii?Q?SN8Tjh5HNfVKY/jxLxwK141MaWVvbq03XEuofjdPPAzmKBM7YnOy4Ct9gWvd?= =?us-ascii?Q?DlkpVetLU6mfr0lFwSougHnSnAS7J8kwKEHTkaywkevzmSV8vrTRuiL9075W?= =?us-ascii?Q?l/c9RdyssCINImL1e+45CMt9as+K+AbJ9KlaQNrry1gGlvrarAbYr/8sczXC?= =?us-ascii?Q?IA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8de18c95-0c6f-4831-4008-08de2ffd848f X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:03.1562 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: OR3+sinAyLPtckw/4m4g4pzukmEVqhyTzzZi4MHIbNMXYE9OpETM2oxjzGaO28MaCpEk7DIag9p+7GE+JNQHnhntuF5CKg8ZR8xlE2WtwdA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Moxa PCIe boards require a specific sequence to send break signals in RS485 mode. This patch implements the required behavior, while falling back to the default break mechanism in RS232 and RS422 modes. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 5d1097c166e4..9ba171274221 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -40,6 +40,7 @@ =20 /* Special Function Register (SFR) */ #define MOXA_PUART_SFR 0x07 +#define MOXA_PUART_SFR_FORCE_TX BIT(0) #define MOXA_PUART_SFR_950 BIT(5) =20 /* Enhanced Function Register (EFR) */ @@ -390,6 +391,56 @@ static int mxpcie8250_handle_irq(struct uart_port *por= t) return 1; } =20 +static void mxpcie8250_software_break_ctl(struct uart_port *port, int brea= k_state) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + struct tty_struct *tty =3D port->state->port.tty; + unsigned char tx_byte =3D 0x01; + unsigned int baud, quot; + unsigned long flags; + u8 sfr; + + uart_port_lock_irqsave(port, &flags); + + if (break_state =3D=3D -1) { + serial_out(up, UART_LCR, up->lcr | UART_LCR_DLAB); + serial_out(up, UART_DLL, 0); + serial_out(up, UART_DLM, 0); + serial_out(up, UART_LCR, up->lcr); + + memcpy(port->membase + MOXA_PUART_TX_FIFO_MEM, &tx_byte, 1); + + sfr =3D serial_in(up, MOXA_PUART_SFR); + serial_out(up, MOXA_PUART_SFR, sfr | MOXA_PUART_SFR_FORCE_TX); + + up->lcr |=3D UART_LCR_SBC; + serial_out(up, UART_LCR, up->lcr); + } else { + up->lcr &=3D ~UART_LCR_SBC; + serial_out(up, UART_LCR, up->lcr); + + sfr =3D serial_in(up, MOXA_PUART_SFR); + serial_out(up, MOXA_PUART_SFR, sfr &=3D ~MOXA_PUART_SFR_FORCE_TX); + + serial_out(up, UART_FCR, UART_FCR_CLEAR_XMIT); + + baud =3D tty_get_baud_rate(tty); + quot =3D uart_get_divisor(port, baud); + serial8250_do_set_divisor(port, baud, quot); + serial_out(up, UART_LCR, up->lcr); + } + uart_port_unlock_irqrestore(port, flags); +} + +static void mxpcie8250_break_ctl(struct uart_port *port, int break_state) +{ + if (port->rs485.flags & SER_RS485_ENABLED && + !(port->rs485.flags & SER_RS485_MODE_RS422)) + mxpcie8250_software_break_ctl(port, break_state); + else + serial8250_do_break_ctl(port, break_state); +} + static int mxpcie8250_init(struct pci_dev *pdev) { resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); @@ -487,6 +538,7 @@ static int mxpcie8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.throttle =3D mxpcie8250_throttle; up.port.unthrottle =3D mxpcie8250_unthrottle; up.port.handle_irq =3D mxpcie8250_handle_irq; + up.port.break_ctl =3D mxpcie8250_break_ctl; =20 for (i =3D 0; i < num_ports; i++) { if (mxpcie8250_setup(pdev, priv, &up, i)) --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022086.outbound.protection.outlook.com [40.107.75.86]) (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 D024E28468C; Sun, 30 Nov 2025 10:45:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.86 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499517; cv=fail; b=QSE67U4bhO2f3YoFC/BcNCpA562jhW8Gna+W88S1+fyJK8u1WGE+D869Ou2HRTpCGSIzBugZPebrTBcwTICuECIbraiwYARpu9qkc9dENiqaRjQYdm3wyhs0sBuXNdrgpFPnQVVephXz29QfXY2pK0DeZ0Yzuh3Jo09feRDtg9o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499517; c=relaxed/simple; bh=8Z32lV1fxEbNTkEXbFJMeyttQIGzZtp8KnuP7XAZtSo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=nqmZfVqms+aC5RzwGked0QqUKoipXluH801QQiVRftIFN8BifcHJXQxZYdGAoywkrjxD8uPcqpJtUZHWPhZ7YEV254u4yEjyrYU57GMrcZuhCwg9b6v2vutfcVyT2FW3owl5ggfL5KBw3SI9sxo/W5kTNoeEq8ZhMt/VJv/3qBc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=LB4UYcaU; arc=fail smtp.client-ip=40.107.75.86 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="LB4UYcaU" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WLSWcfXX7FLmTfFZub2kpatmERL6J1Fsu5//j4nQ4jW8wMmwztXPP9UXoF5LkhYyyiCAM9sJy4jMubvLfMeGPoBLf5WOFrL4dPzX0RZA9VFnFOW/FeMlnZY9G7K+htJQUl+6Xb0rCGxviio++y00AKd2En3j9KBJE0YySHz+8I2+AyIMh5K7fWWxTEB6fymIB+Je6S8MOOXV3sFkaZmBIUQbMWlLyU4qjQ/CK5YvSd3oUiRRbbzOwdFd9V8Qe3Spl/GK/ZoeaE8rVSsH8ViE0gPdDHzmO4UwWzGD79qO2lD7OaUhh+Kf2jH9bGV2K4SNhUqp/DZaqNLC4cSbqHkEeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=EU61xCX3WvHXF6+Yfg08x8/jiixFt14u4n3cNzEgQKE=; b=tiuMcV7wnX5gUX08p15ix16aS0lLbdHMpQuZq0BDjjs2ayJWlG7kub6bNrLzQ09SBiBynur1uUevn7a+HG1aYolxyzNqqHCRfEHd/AG8BEdBXW94vn8Ksg9SSZf+ZLMgp/0HNGx2+0jr0P1ykVHc7gaMbD0OGVAmWwBn5JLTqJwmQNloRHI0vkncj3s+6iKkmGwaMMEVffoOlLgj1O1sO/9s73t4YB456TiwefIuqU5cBNzDW6XFiG3AEgA3v2U+ft6vsUiZLngmCSxGkGrWFrZLyKXNqUrkt9X2iycv0BESXkCSOSJ9ueKnxxwLg6q4qi+k0DiC265Ke2nY+4PO/g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EU61xCX3WvHXF6+Yfg08x8/jiixFt14u4n3cNzEgQKE=; b=LB4UYcaUvY0xJvVH6QgOXfDvLuMUMoGvcLTofmKFJOltcP4GckVQ4IYmXeIOCM7aYp2voSXaKh+4GTA9XS7eYt/m0SMPXjT3SN3lVcgUY5uaZArN1JF8l44EjgF0UvDrwluY5yZmDVoK/2KfXLV3tyZxPvGF6EzRJJbDWnBk7UE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:08 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:08 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 20/31] serial: 8250: add optional callbacks for rx_trig_bytes Date: Sun, 30 Nov 2025 18:42:11 +0800 Message-ID: <20251130104222.63077-21-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 7d892f69-ee3c-4a26-8d3d-08de2ffd879d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?H9TUPr36jBA4SSa27Gukn3rkjaBNMKmislkzyazxMb9x06t+W/K+ha7b7ayj?= =?us-ascii?Q?1iIpIkJSfg4pmlNceQ9GAaBU9LhtVA8rDhYv3tYL/SmTG82aJqd6REWUkLxk?= =?us-ascii?Q?gG3MeOG8OOSE2fQKfZ95cJd8QgUI34KfmpOnFQ9fhXAQQgBCLbQVxAS9uWaT?= =?us-ascii?Q?fNePg4R4FbSso7j1R8SFaj8PO7nPK6QXrVtGFoIyOtZ06wkze9YZJN3HgTky?= =?us-ascii?Q?DMWl9hwRvZBAb/tlh8qMBQ41F0n4AKgF5pkwSqhTL7i9Knox7/eVK1MVjjfa?= =?us-ascii?Q?y/hd15+NgZ3lfitOxtPLvrkaDnwDXetu+nj7+LkXMmnazNiKAa6cIi1jYVUC?= =?us-ascii?Q?xMMsDyt5jmSS6uNwNElUu4DFy2D6BKCbMO7bzy+R9KapZHrptMFn4DgSfbkn?= =?us-ascii?Q?lAHwhXUBt7WfOoROqevJAYvu54Yw+SNf4ntzaaX1LqJHskTb2hiAZJqjhZ60?= =?us-ascii?Q?MOdMZb0c+45WHDtW8G6xEaZXGe0MsIUlai/F8jLxEnsVm08JCdB35AxQ2Izc?= =?us-ascii?Q?mXGR9R+ZpcnWTCo23AyqKk9/C20nN1HoEQrHHobA59rFIDVfhkyjpfqq1Mx4?= =?us-ascii?Q?+p4CtZxE849j6s1+rQjr1rdqwK73BOfaTTlLY0+spnERdbHnAxMEMDJoD3pp?= =?us-ascii?Q?rJTOG3bNfr2cZYXCNyp8N9iczxmxGDHt0Rfnw8LZL/PC8eL5bfWQifMgV4ac?= =?us-ascii?Q?G9ux7oiSlEUDUaKw1/fJBQQdJfjr+mh2J/TjKLvtJJaEogvUw94xalW5sH8G?= =?us-ascii?Q?Qa/zzBeMGh5aN/nW0/WY8reBC9qUTBJacbcfa0JNEQ7ZyRKSTBXZBKuxsW57?= =?us-ascii?Q?zmpnDJV9ucf/s1osTCNmJhFsTlHPuAkqmiHqNsnFN4YkpGwcnBZLkLlAKm+Z?= =?us-ascii?Q?qxfmr11L8v3/FlvIpvX3P6cr3zgl3OaEGFLYgO1MLqRtkTdDF+kbToTQsnE+?= =?us-ascii?Q?q8fxBNEFwmkzP+MkTsx93elxgov7NojVvJ6nPXXutWGdt4ttu2L0OxNdOHBu?= =?us-ascii?Q?9fmiMn+g0kIyaoBSlT605KypXiqfujtaRNIva+wdi+3Rnrm10776p+dCHPNt?= =?us-ascii?Q?oOs9Q7m4GMOwSowjOczHnNvoEI/DAGS16+MitcNmU7WzLffb2IXjxM+nKYnG?= =?us-ascii?Q?lyljHmF8XXLSkH4UaVAbA0/KcXlvSZBOGNMiZVZLcO7vtoAzragC2QcXSYLp?= =?us-ascii?Q?SNJoHykCUyq6j5iAOjDte0E4G1VI6yfZHNOdp9kOn9KIEscm3b/pwWQD7/5y?= =?us-ascii?Q?Lm3oIXkij9SS9BiqefkSxAo1DBWLDCp36JE9KFo73rtz0grLLBKB/fQQjXSt?= =?us-ascii?Q?nQ0c/maN0nlTz4l5DL9rkcKMqCPUoftPOlnlqrGAISpBVean0gHpbf6GWx2v?= =?us-ascii?Q?OygfVfa4om8dxACO5YUv2ltycI9daaVMzjsJP8+lRl159DKOWiUKZedTyTaz?= =?us-ascii?Q?+Ym/zoRhvpaAbZAIvFzWRXd3EPqfm2JBqHEoHJwOMx/etbHP99sxfhFurtrd?= =?us-ascii?Q?1LMlcE/zfiZEBTR9aWBeP0iByzrtmvrR2wgf?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?yRk+/XG+A7aDPUeYrCEbvau3ca/ulXiPwXt3VzLYwotEe89/qZ/dEoiPTz1N?= =?us-ascii?Q?Q+kcvGX56uhC9eZxqyzyK9EGKtbzFKdd9zu+mTvXfb7ctJbxgz52gIK1+txZ?= =?us-ascii?Q?BpEfCuNIOWGoljluoXC+PBjhB8Tm5F0eonKhhofREWkzsjGPfn4I0FlOBHMe?= =?us-ascii?Q?HZ2jos/2i8YF6/qYanpy3pTKPaTCdV/r6yQdpQWldlzl8Ot9MsDZ5YHw97Xz?= =?us-ascii?Q?XUkn4tQeel4kMURRHOtWfvT93TjUtuGYgF/NKlthQ8Eki1yDLx/0Kjfg+/eC?= =?us-ascii?Q?mXfjp/u1IM+yZu730/gxckd4MKyNno8lLvHiYknRL35oTN19Oj1+P9l3G20k?= =?us-ascii?Q?y8bRQFq6xxYiIAbi8STLDmosGt29U3LLfuEHDRlzTnoWcUC/3216Gzl9g3FG?= =?us-ascii?Q?WpJ6g4riEKH7dmAZUvyexgtNtUocuPvNxMxDgbYaMKl19YsNCFSJTfNXo9WY?= =?us-ascii?Q?1gMAsb2IvDNsSVJWwW6YYWhAR83osEW9Q+U8XuSMgtAWE5zkul1QKPJB96R7?= =?us-ascii?Q?f698MJiKV7RQ2hgQNtxFogujuD8eDMVJO5eMCca7et/0tfpQzyC7gwdowe/o?= =?us-ascii?Q?Pm66gXTBXp1TqTcTGlBFA2xekRvpWqayZnHT/ZbR4/E1ZwfriZuaFEQ6BIjM?= =?us-ascii?Q?AyogNzsXPzWURxOjMeEifYI/F07Sk6n8XneoN8uhBkVgTaQ+uqavh/1S6otx?= =?us-ascii?Q?scVDKT0+FeMNhDuSsubGCUuRWR7tchNdc+fJrug0OaRcKjU3UUOEj6uumAZt?= =?us-ascii?Q?/lUpobKyjbM8JlTm5YFOWIgDYuYleQqW9kSUEOeKeJG5cicotnKni1zjJEvG?= =?us-ascii?Q?IghxwxCdBsiyuXuKZhN1UqQ56r5aHRfRra7JGLWoCu80StrUYZYUbMUPnxcc?= =?us-ascii?Q?0jde9O/r81YYHoYQ2ULHsGpFKuDRw6JIikkR/2jksq1FB6P1f0DEptnk3eHh?= =?us-ascii?Q?gT4TMMbLPJ3HI3DcAQA9kLDa21hxWbaPHgS3oVtkYxwnhkiQDJJuVvRi8Mxr?= =?us-ascii?Q?SavP0xnfh0A+8uNXMx2bJig1vgJD0+vkPmt90q/WHWkFaloBvKdFf5Kcg4R8?= =?us-ascii?Q?Mu6uKBQekeAiYZr29bs9m/qwG85KGZ5mSkUBi2PMbUpM/tPcbs1ZOZQ0SjhA?= =?us-ascii?Q?G2tpT0M98Kg6w6BxqES+O4/ugEKXccTeQZlrohXiXVm29WjgdGTENu8ZlCAa?= =?us-ascii?Q?4zrkNufDeNoZNglauMqRut3Jc7dWaseBvQWqnwxFDUAZLOyL+dH0k6UwLPV2?= =?us-ascii?Q?bjizprpcslAyCuuY6ufhSRm8DsLiMiXjEHqYQtKtCeJ5ZFob83F9NY2TxK/2?= =?us-ascii?Q?TiH5AnTTEHDimGAPcjecoXK5xZwHTc4No/y+TXVG6WAlE8T32VDWeUFE0pgB?= =?us-ascii?Q?Oh11cv39yTwEgPRyRz/1msLqF3z7/ci2YmwqpIQC3jMni3Z7jMqWJwyp3HGU?= =?us-ascii?Q?kh/c7lA66dnegLmrH28UbJV3XEWssJOr7Y6/bXzfvkKZfSODXf2dY6Y/lXd2?= =?us-ascii?Q?KN13aC73MNePXeZTmCn3hqK983hCXT3jDD7we2237V5fWs699JyTW4me682N?= =?us-ascii?Q?5MXJMxAtKtwlDyrTrmwFIVUr8rW2aWV89la5J9+977to5rj72/7PDWCkELlb?= =?us-ascii?Q?1w=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7d892f69-ee3c-4a26-8d3d-08de2ffd879d X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:08.2526 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: F0wzrbMtirXnWsh92c6i/YBMMc8E2UD7q7+oVZpDHDRDWruyluzzyjGF1NvhkFRyL9M+OfpZA7aGTR5QQyP+iOxhfbGHnVnH81wu1YFcQxA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" The rx_trig_bytes sysfs attribute adjusts the UART RX FIFO trigger level. Some modern 8250 variants require programming device-specific registers to change this threshold, which the generic (FCR-based) path does not cover. This patch adds two optional uart_port callbacks: - set_rxtrig(port, bytes): program a device-specific RX trigger threshold - get_rxtrig(port): read back the current RX trigger threshold When these callbacks are provided, the 8250 core will use them to set/read the hardware-specific threshold. If the callbacks are not implemented, the code falls back to the legacy generic path, so existing drivers keep their current behavior. No functional change for drivers that do not implement the new callbacks. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_core.c | 4 ++++ drivers/tty/serial/8250/8250_port.c | 16 ++++++++++++++-- include/linux/serial_core.h | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/= 8250_core.c index f642e8c77911..3d8575874759 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -808,6 +808,10 @@ int serial8250_register_8250_port(const struct uart_82= 50_port *up) uart->port.pm =3D up->port.pm; if (up->port.handle_break) uart->port.handle_break =3D up->port.handle_break; + if (up->port.set_rxtrig) + uart->port.set_rxtrig =3D up->port.set_rxtrig; + if (up->port.get_rxtrig) + uart->port.get_rxtrig =3D up->port.get_rxtrig; if (up->dl_read) uart->dl_read =3D up->dl_read; if (up->dl_write) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 64896f37b75d..d7baceacd4ff 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -3104,9 +3104,15 @@ static ssize_t rx_trig_bytes_show(struct device *dev, struct device_attribute *attr, char *buf) { struct tty_port *port =3D dev_get_drvdata(dev); + struct uart_state *state =3D container_of(port, struct uart_state, port); + struct uart_port *uport =3D state->uart_port; int rxtrig_bytes; =20 - rxtrig_bytes =3D do_serial8250_get_rxtrig(port); + if (uport->get_rxtrig) + rxtrig_bytes =3D uport->get_rxtrig(uport); + else + rxtrig_bytes =3D do_serial8250_get_rxtrig(port); + if (rxtrig_bytes < 0) return rxtrig_bytes; =20 @@ -3149,6 +3155,8 @@ static ssize_t rx_trig_bytes_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct tty_port *port =3D dev_get_drvdata(dev); + struct uart_state *state =3D container_of(port, struct uart_state, port); + struct uart_port *uport =3D state->uart_port; unsigned char bytes; int ret; =20 @@ -3159,7 +3167,11 @@ static ssize_t rx_trig_bytes_store(struct device *de= v, if (ret < 0) return ret; =20 - ret =3D do_serial8250_set_rxtrig(port, bytes); + if (uport->set_rxtrig) + ret =3D uport->set_rxtrig(uport, bytes); + else + ret =3D do_serial8250_set_rxtrig(port, bytes); + if (ret < 0) return ret; =20 diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 1aa07c5187d8..96646d3f2943 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -456,6 +456,8 @@ struct uart_port { void (*pm)(struct uart_port *, unsigned int state, unsigned int old); void (*handle_break)(struct uart_port *); + int (*set_rxtrig)(struct uart_port *, unsigned char); + int (*get_rxtrig)(struct uart_port *); int (*rs485_config)(struct uart_port *, struct ktermios *termios, struct serial_rs485 *rs485); --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022086.outbound.protection.outlook.com [40.107.75.86]) (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 09B342853FD; Sun, 30 Nov 2025 10:45:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.86 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499520; cv=fail; b=ueT/lZe3V2UKunn6R2Fxh45OPAmLlaIfvYqw/6r7fiYR76RT5+KkgNv16PnrkmmMPBieUDHsFepjCEqPzvTm04quV/AtcxxAHbezJIvznvgiEpSpF1XVU3nXYAhwgZZOagE+hTb3bBikDGi/az8dF/ju7Pv4Drt4N05RqiYGuqI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499520; c=relaxed/simple; bh=cgwaDyOBQ4el34TaxOn0h/tN8eWOwWB3+b+flIkuFoQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Dy1/hXKdw0NPciy0Wyy7Bs+akMIqJzPvO+1BrU4k/6kgkGoF3jLjhpNfHdEblno48QLb2z7Hw2XLkbXCCAuZBAQVTnyoIkeas/tDixQh5LW/ShvTNlM7SpwIxcv457Gsnjk7UQStf+qZhm8+O3L+PlxU54QHwoZ+VXflG44ADGM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=DojhNwHl; arc=fail smtp.client-ip=40.107.75.86 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="DojhNwHl" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mx5tMDyBYQO5vRG3SIWcL857Z0owdr9R/sIvcyxiR8vTsktwGkNnxcGl1arr1zuj0FA1qnztmjvJyUkrVhTYoTGNIOLLhEuJRHOitX4eCmnhrp+Lhg5opDklqBklhA54G0gBiEOG2lJi4Y37z4Vr4V/vWQWQ+BbMS6Ad/+MoKBbF1x4KPTEbQkoCGijWJPTrRlQzwhnYEu6Ppz8qrRiVD/MTj3KKBjtu3+2EDv+awDWlSsl9fS1l72hkOJgbwztiebJbkqfyGPuCt/CeI9PPP7GD4R72hunN0ifUNP1doH7fyqIirDHI/owPV/7245nOdNteCLo2eaRgd68C+wp5dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=thx5u1ywBYeQkGbORIeAQAO4h7KcwM5+zifq7AJZkNk=; b=DsGR5c2aNb/S0l5T86mSNSyJQr0DRWTrtYPNDQr91tt6kdHxmGinSOsE3j7Vfsyf6adR9FsdaVSKIoe7/10f0sGTDvDx4XstAv7UVvq25ajfs02XYAf9ovFTC/2XbBIHd0LgeJ9hyukIed+/PJwBxOHiWXlOuUu0cXum/DUe/dy5aW2olWkScwSHpLJxYxjg+fBhMScY01QDieaYWEP4xPxCZ2l/yqS40w1GTp1mJAUgivIykvj9et0mladCtGJ3h6cANKkr3JlR3HJgLsBJxWjqLUDPfmQS9Q5YXwNEl3LPfdkvRSO1JRT0pu1o93YMu1hFOyCjaTwboUXDsaFnmQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=thx5u1ywBYeQkGbORIeAQAO4h7KcwM5+zifq7AJZkNk=; b=DojhNwHlh4XWzLVHemFVTqFDyNeRu7x8G++nDxpI5EhDzdqtbFVAOYwO492MAa4o+TEt3UuVeCx3KknsEhpvVUpVlvvO5VykUBdTqIT9moK4soibqKJQWTWOwty/cdM/ETPYIRwTovaJHCTsl7oP5LWrr19azD1TimZeDSdNmTo= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:14 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:14 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 21/31] serial: 8250_mxpcie: implement rx_trig_bytes callbacks and persist per-port level Date: Sun, 30 Nov 2025 18:42:12 +0800 Message-ID: <20251130104222.63077-22-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 48ca0788-6fd5-4abf-2354-08de2ffd8b32 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?NmNdS/S+owyO2jQTUHVHHdRS01qZ8e0DEMIODTav9egwfcyfJSd+IDonQqvu?= =?us-ascii?Q?gGU9mnj7AQylUv2G64K/tD1JoFnUZ9Sf9cDb4ytuDr3YNhChCfhRXQcR47Zt?= =?us-ascii?Q?BOFAmRETPw9y1ocn6X7vPRfkMSBj9YhQUv6R1382sWDYJrfrd7gpO4MBTP/1?= =?us-ascii?Q?1f+8T+oa1e8qtYvrcEfeZ2q1x4/BeDP+EC/u9u1jlezI4EbQMMVIM16iVwqM?= =?us-ascii?Q?dXpaVwPLFkQ5+a9c15pJgf3fAuJr0BcZ1fSlQBNorYw4xsBXW0nQ3TfI7Lo5?= =?us-ascii?Q?aM9pwZQPQ6CC1ynbv33QMEE/k7jWYwz4jDlHzrSG+vpPeX8oO6WGVFqIHDz1?= =?us-ascii?Q?/RaWdYfj9XuJBhTmrnT9MJyEU4YaWs3JcXUlPdQx1RsH+IUEYhoPpSJorOtF?= =?us-ascii?Q?zDX+6CZo7xvGdHoqsGI0RYoggcyHBnDUzIr2UxcGxbYt4TePwzeo2OPuarVy?= =?us-ascii?Q?yrsl/Tig3X33tl8xJei6c9hx63lDlypBRaigejt9Q8UbsmeyTD2Xkq8DyBEb?= =?us-ascii?Q?ClelWZ8/9dytqyZjGTxO4kjbtxJV/c40FXFle57IFCCrnQSSlLhC34GYA+ta?= =?us-ascii?Q?X64zN82VZ7QMWu/gsUIblRp1ilYCZvO9QnLlMFKp/RZCPPcB+4I7QpBuAukC?= =?us-ascii?Q?kTE/oM1842ff7vJPZXpFLpPbIK2G0dNvQXKI6DAozs48Bbj/YdKGcidKMOl4?= =?us-ascii?Q?ltQ4GsnWfiNb/mLhM7sLhaDtHYCWYLa+3qnvfjfT5aPWFLj02J4wmXlg8W/r?= =?us-ascii?Q?6nyV/dR/0wg8SEOSJ5Gnwts9wzlczs90wAh/0ugES+GAiPlz6qKSX+zR/dxa?= =?us-ascii?Q?HG4oYSMjsO31Z+DBmRP4X4SY628TkP+ogoFB13i2XnhLC69aH8yrLRwdgVCS?= =?us-ascii?Q?ghfWPBSMsas2oD90StD/rytDwsaRCwWFo9BoQVVbI79BiaJRG+MU8AFCH3hB?= =?us-ascii?Q?QgYGCKszi/t03z//CeCDvvOI0y6rLlIbY5Ph2uQkTZ0fsyuU2Sz6VnWZGEJr?= =?us-ascii?Q?CR/LynZnMCXdWxZWnFnx0QCsFklY2rVFePSFDczvk8vn/JiXevYCzoKoETdt?= =?us-ascii?Q?6KFFpWkaJKP/J+jmpGcz/PwU/iiFvRg1m3+GkMOjjsGlRs7fFolZO5WC3gXm?= =?us-ascii?Q?8mbi3KPWO4gRB8ZXeLDoX2dyF296SKD5+2zXFLT8UqXe5kVj9Mdk0H01maE4?= =?us-ascii?Q?IVeng+wa3APnqwWW0KVEzyA8uQRUIa3YFj6PahJ28KLnOIfql5ulqtq73ImL?= =?us-ascii?Q?i9abMNOUQKs068gdwu2KKjHKljgepuAuAIFeUi/1n50oYJ1w7pQapr0l468C?= =?us-ascii?Q?Yr92yzJCQpx0Uh7aDOMXANLXela8RNfYH8lY6SPMece2AQjycC/cH2d5WcXL?= =?us-ascii?Q?+hDjgZg0cL6hySelBXkWjiJJa9z/dhvyIpkrk6nAThunOG9dk7GWyoMkgJbQ?= =?us-ascii?Q?KM5fCjOi+4NTD2tu4U3biijme2dD2TG0Vg43ol5oxFhFaLrEnKsrGai3kuWY?= =?us-ascii?Q?XedzTw1sHBYCJ1bO7qT03ECI/W5s1fW09uuw?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?4XPcXYab0PVPE6sxl4+RBGFVmtS/OtHTtBxXMVEbLWjCSHuKIisRXJzu5lhc?= =?us-ascii?Q?rC8Nnlol2xwtR+8xZCjxNnxvP6X0PXM1n1zUXezcMIRTf19QD1idkc0oxGlB?= =?us-ascii?Q?1mNHKLBj+XMxjTvFk5hc0Q+rhUKpuEtplxWe+FGPTmo6r8Tzjvuwp6f3kTFh?= =?us-ascii?Q?TDYjb0eLMQSxty1JaNsq6QblLxX32nQlas74UUv1FvalNNnpx3nnM1kJi4+5?= =?us-ascii?Q?j3rdUUuZG4mV/b/jzntjpVj8haeY+3/1iSCPAmZLwUQbjUn8Ks/4HToAM6zM?= =?us-ascii?Q?Ep7RKKCHYQL1oXsWKouzLdbV1uuwOUAinJZ2hX1xlBEUcdjeJpyxq6NalBza?= =?us-ascii?Q?U06xa5A7dr6XIcm6AprX+hDSN8OPZ6lhoGpd4+EUPH+JE3DxM6xRIUWqJ9EV?= =?us-ascii?Q?/N54TXsLVqF3G+Jg1t6Tg6oJo0KC+yo+TJsFuXrWBBWH2y7VfXtTewOYHiL6?= =?us-ascii?Q?+T22dTYO7VGTCpvZ6KHKYLpkFZa6x/e0qyMSX/sUE719yOY0Ra8e4uhyAf2p?= =?us-ascii?Q?sFp++OUjXbyT+SH2Ggg3n4/Kf08fZYKtU51O0AyLvxvyGy8KzpiT+2gTXJn4?= =?us-ascii?Q?oknLDhK3gZ+7jubxkw2YiNIc1K5ExDY1Fo5g/d7meJdsptyfCtvkuvnbAW0v?= =?us-ascii?Q?S0bgXnGMLLbsoaG+TVnmvHMDwgLPOgJA47Vrob8TQR7i2aWkl8bpT4NMQQsk?= =?us-ascii?Q?g/CVwS/XtYCd0Jfratw7fp83QKCKIchr6ITOFKDpPmYgzTLBGAvspGqJ+2Qy?= =?us-ascii?Q?OHYw2PMVHM5fNSOgHYuAdXGYOyh6/eUpj2cijht2q/HKJ/enEWMiGofG7QeV?= =?us-ascii?Q?+hSKBu1MZbYemOkW2+XMxckojuDIEpPlM1/05O3c/ba1wxpDFtgBbgkOpJqv?= =?us-ascii?Q?3Ql3pJr+QSuaoPbBvdPT8VtHvscBGmbyPkzAO5p+ZqUhOIjVTgUrA5R4edj3?= =?us-ascii?Q?fhfIeMnEGZOoiuglZwJPOolpApheBsoMC9QgPMCwocuRtPoa1TOpVbPH7J9c?= =?us-ascii?Q?qIceFf00KVXkyXi6DgKTRmNeSohLsqshl+3yke10YJ6o7pDQnkz00SdDL0L5?= =?us-ascii?Q?M7WwtWtMm5EjwCxmiFkethNSLOUckAkqORaFKa/CDHSMZ6d9tc4SjPcGHHJK?= =?us-ascii?Q?NSHUR7WOjO2wR7rHPnH88uiw6M2DFKM3lb6HvPKR4n64B798e/DTyDdoSNmk?= =?us-ascii?Q?OloxQZUBHGZs8j4ciGJaQBJnyUxjL0KA9WKm80BaKzLzenM0IHoDuLDKwWdM?= =?us-ascii?Q?qJ8OJ/JpxN3vAkGi+P6gETUkyf4wUjsnSMrTWa+oLjhevlcFmVlCOyNpN6Xc?= =?us-ascii?Q?4iVtwAnzejjRUECojBa6CNtrYzacra+4ig7x3C944VpCgeLt1wOTMYSBDPpP?= =?us-ascii?Q?h4UYjEPvqbJDkq8m09OrSUTtZzzka3lPWJb4PsxpWr9a09iRheyJIYOCgADp?= =?us-ascii?Q?Qkp6sJXi1Xr3759YkRcdKgksklyopRtSHb65FoEbSvOCPMIDkTCXxLciFWlL?= =?us-ascii?Q?3NiDe7hiMUoVhuUqPwx0Dz/a0fcKZdwXfVC0Su7S1wkwa0Pa7R6/J2N/pjLj?= =?us-ascii?Q?t6anmzM/E5kAcmykGSnXdBV38GJozj7i5DnBdJAuSlI+6gQNtPsz0YtcI0aM?= =?us-ascii?Q?aA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 48ca0788-6fd5-4abf-2354-08de2ffd8b32 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:14.2826 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Q6ppCun529/MkOMS9e8WLbeKNZNPVSy5dNbbIuaMQT9VX+FZEFKpUC/btaKYWSYAhVLSsiuxYxHEPmL4UAA2VjRjpOln++rY5evw02edudY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" This patch implements device-specific RX trigger handling for the rx_trig_bytes sysfs attribute by programming MOXA_PUART_RTL directly. Changes: - Add a per-port structure to persist both the registered line and the RX trigger level, allowing the level to be restored on startup. - Implement uart_port callbacks: - set_rxtrig(port, bytes): program MOXA_PUART_RTL and cache the value - get_rxtrig(port): read back MOXA_PUART_RTL - Use the cached RX trigger level during startup instead of a fixed default, while keeping the initial default at 96 for backward compatibility. With these callbacks in place, writes to rx_trig_bytes update the hardware-specific register immediately, and the selected threshold is preserved across open/close cycles. No functional change for other 8250 drivers. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 49 +++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 9ba171274221..04b9c9ff5cbf 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -93,11 +93,16 @@ #define MOXA_EVEN_RS_MASK GENMASK(3, 0) #define MOXA_ODD_RS_MASK GENMASK(7, 4) =20 +struct mxpcie8250_port { + int line; + u8 rx_trig_level; +}; + struct mxpcie8250 { struct pci_dev *pdev; unsigned int supp_rs; unsigned int num_ports; - int line[]; + struct mxpcie8250_port port[]; }; =20 enum { @@ -243,6 +248,8 @@ static void mxpcie8250_set_termios(struct uart_port *po= rt, =20 static int mxpcie8250_startup(struct uart_port *port) { + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); struct uart_8250_port *up =3D up_to_u8250p(port); int i, ret; =20 @@ -255,7 +262,7 @@ static int mxpcie8250_startup(struct uart_port *port) serial_out(up, MOXA_PUART_SFR, MOXA_PUART_SFR_950); =20 serial_out(up, MOXA_PUART_TTL, 0); - serial_out(up, MOXA_PUART_RTL, 96); + serial_out(up, MOXA_PUART_RTL, priv->port[port->port_id].rx_trig_level); serial_out(up, MOXA_PUART_FCL, 16); serial_out(up, MOXA_PUART_FCH, 110); =20 @@ -441,6 +448,31 @@ static void mxpcie8250_break_ctl(struct uart_port *por= t, int break_state) serial8250_do_break_ctl(port, break_state); } =20 +static int mxpcie8250_set_rxtrig(struct uart_port *port, unsigned char byt= es) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + + if (bytes > 128) + return -EINVAL; + + serial_out(up, MOXA_PUART_RTL, bytes); + priv->port[port->port_id].rx_trig_level =3D bytes; + + return 0; +} + +static int mxpcie8250_get_rxtrig(struct uart_port *port) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + int rx_trig_byte; + + rx_trig_byte =3D serial_in(up, MOXA_PUART_RTL); + + return rx_trig_byte; +} + static int mxpcie8250_init(struct pci_dev *pdev) { resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); @@ -513,7 +545,7 @@ static int mxpcie8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id =20 num_ports =3D mxpcie8250_get_nports(pdev->device); =20 - priv =3D devm_kzalloc(&pdev->dev, struct_size(priv, line, num_ports), GFP= _KERNEL); + priv =3D devm_kzalloc(&pdev->dev, struct_size(priv, port, num_ports), GFP= _KERNEL); =20 if (!priv) return -ENOMEM; @@ -539,6 +571,8 @@ static int mxpcie8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.unthrottle =3D mxpcie8250_unthrottle; up.port.handle_irq =3D mxpcie8250_handle_irq; up.port.break_ctl =3D mxpcie8250_break_ctl; + up.port.set_rxtrig =3D mxpcie8250_set_rxtrig; + up.port.get_rxtrig =3D mxpcie8250_get_rxtrig; =20 for (i =3D 0; i < num_ports; i++) { if (mxpcie8250_setup(pdev, priv, &up, i)) @@ -547,15 +581,16 @@ static int mxpcie8250_probe(struct pci_dev *pdev, con= st struct pci_device_id *id dev_dbg(&pdev->dev, "Setup PCI port: port %lx, irq %d, type %d\n", up.port.iobase, up.port.irq, up.port.iotype); =20 - priv->line[i] =3D serial8250_register_8250_port(&up); + priv->port[i].line =3D serial8250_register_8250_port(&up); =20 - if (priv->line[i] < 0) { + if (priv->port[i].line < 0) { dev_err(&pdev->dev, "Couldn't register serial port %lx, irq %d, type %d, error %d\n", up.port.iobase, up.port.irq, - up.port.iotype, priv->line[i]); + up.port.iotype, priv->port[i].line); break; } + priv->port[i].rx_trig_level =3D 96; } pci_set_drvdata(pdev, priv); =20 @@ -568,7 +603,7 @@ static void mxpcie8250_remove(struct pci_dev *pdev) unsigned int i; =20 for (i =3D 0; i < priv->num_ports; i++) - serial8250_unregister_port(priv->line[i]); + serial8250_unregister_port(priv->port[i].line); } =20 static const struct pci_device_id mxpcie8250_pci_ids[] =3D { --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022140.outbound.protection.outlook.com [52.101.126.140]) (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 C497827FD48; Sun, 30 Nov 2025 10:45:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.140 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499527; cv=fail; b=M3BKTzwuXYQE12HztWb+XP6UArsDlo2nPEZYzNh208S1pTBxrL12q4erRE6+nnsNLMM409azLXRE8qLeFjHHnst0bsnrsnamyjSLCIGRHsFd9f31Ito69IjxJ/QGm8mFgR+v6JJqEpjZkSjhPf1vvSIfz2k88PNLAcBFAD6GYpY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499527; c=relaxed/simple; bh=If8+y4NBkB3cX00ed7KKb3XA0NWMZtxDOXUfvGg97YA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ds2+RvbYvq57ubCZhM8CZsPzeEsR4FhbrhOV0q28wpDLWKgmnbrm1Ag2j62hHx/fI0g+cHeSrZELszvUZg5wL/fuiyWg64kmdZhdD1bpiKljKSiZ9rhOzOYDZVlk7i5LnFqvZKNSyFKhpU30JWdJ7ai+t8tJTNlQOsDRZU0au7w= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=fH+UdzF3; arc=fail smtp.client-ip=52.101.126.140 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="fH+UdzF3" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ABkHfauBeyTQienlPa1T7Q2CDZrntH06Nk5/ovtvdXSBByp8AkCxBgmIabkWrk4oUPC74vHCOWbX2ZrTGo/y/N2HZ/gwYe0m3DnfSW3DFCwe3JqUG9gkeiXJWqkS7FFlTKuPPmn9b0whrRkrbcO0olWJzpXZdoXHqYaGHMdrid6nPxw4pdIFApYu5HC4Ny/LNAz5+V6g5wmrppEqvraHJbPJOhOkiA/A4uxAzCczPWg5juVYO9lTJFeCMXQO5vhWyA/f9XAfY/CxjwRs52prNDa1L7kjv1EBfLKecfifKnTxg4nNwESkOjg8oFJBgVKF2fYDYvips0eV551LHDYJwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=d5qnplESmJN8EVLkstzuyTH9YbG7Uy6vFVAZ0S4GMA8=; b=eRxhLs215pXmYtN1oWLoQSBhixk7gJ0j2R1mwPxRTPvtvEtvIrIR/cTPQNjTDxTMeaX5mv+QAmJQE9w8TpTsMpaV3zwridXiu8T9T88xMmxNbIHO0I+mRGHvaZJmD0tvHGCFRzgy9mpFyUc1pdOKH+rnL2dCJQ8x5n5TIHhAeaXOuZnKW2XXAFMR55k3PkpjXxy+ErhdMvnF2DjPAhg5FK1WqEFgf7LeYxw6wMeXoXFExnv2jPeB9UXjXBZt/sHLLNeC+FxvQTYU480s+XU7SA0OHFXSMTknl1Due/COLLx45BKFk19ipwsFNVUKGIA3zAPHIAqRSknU13dx85usKg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=d5qnplESmJN8EVLkstzuyTH9YbG7Uy6vFVAZ0S4GMA8=; b=fH+UdzF3dN0pIuYlWtjjF/Tv2ebXO12KP1CEK0bopfIQBb9XBojBHPZFhnOAqYov5ZpFLONn/sanCsDoHyRFYjNNnfysrJNC4bxgkZ+FA+3izNF4U+lR5jlA16XKWQnTm3MkCa5roiLheCO/MYDWMSiCpBWLLug1df8bzOyc26c= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:19 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:19 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 22/31] serial: 8250_mxupci: implement rx_trig_bytes callbacks and persist per-port level Date: Sun, 30 Nov 2025 18:42:13 +0800 Message-ID: <20251130104222.63077-23-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 1466e2fe-1583-4a27-3a2d-08de2ffd8e2f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?fpsnX8wzIFJKmoDbYO4O/cR4Z0dnm422tEgoyk8O47Af7eZP2ukbk11QW7bw?= =?us-ascii?Q?FJum780lBJp943A8EoDKvJs9engodWZF+nGwolwyD5T92AxTtUo1SlhtynmC?= =?us-ascii?Q?8SFm2akGYRpkJSWSIv2XpA/7zKLuj65TxsHn86xtcR0U/PFx+hykkHW1Vf7q?= =?us-ascii?Q?ZRIC6OUXH2EuozKDZaF4yxMMDmwMDJNtmwS+HcVo/eT3DEWYprnpR3FWHq8u?= =?us-ascii?Q?OQnpLPtUZ45ke//LenYE7zbJzEyTnOn/cLSFyOTFwmk+l+TqiAAU+07sYgbM?= =?us-ascii?Q?ypdBVsJRKKTwrRmhgEblWTidA5FaZkPsRvcQb3xAOVTNdHiVOttHdiPlDAta?= =?us-ascii?Q?8ZqmQRDNyVGNvVkwnB5sE4CJ2y0uqPmd8jcRcF1I9HmYWIhK0LiCWtOQny7U?= =?us-ascii?Q?9MagDkB1AJSYqF67rD2gzDQSgSr0V4juKSi17KbqY+k7RW+ZAQ9qc2xCcDAP?= =?us-ascii?Q?RdMupIvRCTidgCCQUIx1eCLAFuyzcMESIZUth1zgpUccGUC99oR8oLK5/YOc?= =?us-ascii?Q?89U2BgwD/TkVlPRkmX+DoMPwXEkp6/EwRchwgIahkAyhLsyQkww15Oy0bfm4?= =?us-ascii?Q?MFoZ1wGvw6M4w6BfZWObmmFv7QTJH9vhZ6I2GtivDJYG/n6z6d+5/vg2J8Kd?= =?us-ascii?Q?dTfWdxy+J5ig3bk+RgYDyWDpbjuxU5zGTYc4ScT9Q0+QC0S9V2SnmQL1EEcj?= =?us-ascii?Q?TaBybq4wdKFYYUUedKAMdLacFt8lk9VbYHyiX1zR6TNqhfs+VMzbCs+y3zXr?= =?us-ascii?Q?5DSJ6jc2THfgCCnVjf0UvXeuZ+PPix9aHSbr5mY2qDnq4R86JPbdthtiREKl?= =?us-ascii?Q?EdyCYZiZdSLkbJiMKB66TyHS8Zu0svMH01iC0quv8m4CV7I7w6yH73HN8VhE?= =?us-ascii?Q?4LRKLnOgUte2MbxJtb/+Nqnb/efaFuhqdRN8jgsKEWP7noZvzfjZ4mm1afND?= =?us-ascii?Q?xhBQxeBoluyz/uCsZQ+duIqidb27sy/3rLsYI5dUnQvl5XObwb9BwtXMjIHP?= =?us-ascii?Q?q77550R6CAA+HoArt/+LzIu5hI8Yi/+wCRiIkt9golHpqRyoROk09VBIhURQ?= =?us-ascii?Q?VXD1ejzD6EFKyvDyiiB2lZsewGhHzziTVx4GLiwVyU2d/m9fBCsjli+gEqJC?= =?us-ascii?Q?X19nHYnAWKS9yt/eo77ZC6UdcHX2rwhw21USAPUa7MvOop/1df7xA77so+tM?= =?us-ascii?Q?wvLX2yIGfR2HYUTn3eAXeHz0sjDcTs7VbmK7GHM2kJcxWIADs7D0EhtjFRj3?= =?us-ascii?Q?vGQ2ssuyTXhPwP2rz0RTIAykfHlqOoWuMSLQKTcZYJHAt7q3R0kDhQYNfrvX?= =?us-ascii?Q?kGW2C+6L4EuFTgvUvEoj7nwODLyYgCi0WNE5cb0BeSvdMIm7GvgN0k7A1R2h?= =?us-ascii?Q?+niE4wdVsbHHbrtsVq3GkhwOHF9sQHShIz7uC3h1Ro6vCKK6vJ68Gbj1BGYI?= =?us-ascii?Q?X5oeNqKEmcmd8X586/S9ScwKpA+vYg3g/KyG19zW5grW8urG+ihO+9I1DBGt?= =?us-ascii?Q?eaR2xxBFyqE3rX/woVPmJB04yT2842A7ioLJ?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?+sOerlkIMrJmzV8Sry9xZtatkoYI+3dpSnVlJ57nEidfHOKRPg0y1Ypy/fmk?= =?us-ascii?Q?9nspP0SNkVc5MzpmmjowaW36UhwLjbwajYo8lGTZs7eZcMU80u1x3hoyMLuo?= =?us-ascii?Q?RbuGUT1YnN9DnOe5aXrNNKIlw/omKKT+QtFqBYrTBAP675GGcoUrz/23S+1B?= =?us-ascii?Q?wrXJKy/lzhs4HbQXZ9jkcewvvW888WYyav5WrGtUNr20pFJApo50y57J/9YS?= =?us-ascii?Q?hBO3S+SFOxen7v3yA4ABdPncBeTEU2B7ykrPmQ/gkCtgUav/gSc15MvUNja1?= =?us-ascii?Q?VA6Dr8aOchCCrZ5v5A0EY8KXly1/PBY/EyVnCCqJ80+tdo4eZNzxjcmNbUbu?= =?us-ascii?Q?MePgK9C7/ajF7+pwdiYibKIhEqEfKtLrHOz1+XdZ49CcVGuCwQLmyKaEVxaI?= =?us-ascii?Q?Ihfp42Paj/2y5fxiwp5oct5S3cAcA+LkFymjFFEqBP/Kf0hDa0hpgDacRqcW?= =?us-ascii?Q?jbTge82lT5D7a3pKxV/OCTpvJpy2zr2neJLM4UfAn2SljAnjLipWBwMeUs1/?= =?us-ascii?Q?9SZJD+TPC/uQBT821Z/NaiC7ZNPjo6BJXMZci74wFx7rXOg+ICFArRKYGGjj?= =?us-ascii?Q?LOFwWprlOnc8K3EkkujUY1DMusLNHpXr6wpXH8orZze5gjGG8tP0VmocrLZj?= =?us-ascii?Q?jAJUqR33ilXouFRqzEUrNjhhcwjAnncFsIRcaJf24IcMhMVtV1tx70jEkuJH?= =?us-ascii?Q?qE6g83+drJsa5S0cMjDA3rzZ1d13Od872kWuGSQZkLa7FIPmyYyAYnMgk9sf?= =?us-ascii?Q?dunaKoSDUtZhP1/jxP8PdNI0b2hjmWitGi4hMKKz3wm1yb9iU318V+pVj/XY?= =?us-ascii?Q?lI8erl18UT2Hc0TNXyIS1azwKMmFpovcmXcOk7w5JG8phghKa994u4nNRPvA?= =?us-ascii?Q?AvDq5uZywlRSGY+GLjmDxsqPzYodO+seKBl3Euew9XIUOBoGZa5tOFhGRaPf?= =?us-ascii?Q?OdmIElgROSFtL/NZJ1QxQ3CS1c+Bw7xf9HtsM4JqdQo3nwJVUts114QPwzew?= =?us-ascii?Q?y31vzqPBA0ph2+QY22HHVQrSNrkSrPqlX8BCTYUMZjc6vBpa+59qDYD8lcqq?= =?us-ascii?Q?6HojsIs3sofvWwVFu20oIzFmVoMU/jHIXKbihcWfeSUBmhO2t/GW331reKXZ?= =?us-ascii?Q?u9boivZFRU0m7W4YA4vmAve40U1oK3pdQMyXHieI8ZS57Vhu02gAsMRrHKsf?= =?us-ascii?Q?VHsOc6n3OuSgVRJBleL/fvIJvtWrigXXzghSYrw26pUhoQiSUbFxx43b+bcO?= =?us-ascii?Q?ziQJDZCC0R45/0/Q67fsYI5te5d68i/9GNfvXA6aPSUYoHsF9SFwnRuieD4F?= =?us-ascii?Q?EP4WX2dyzlKV7DQPnbF8+3yUmoRF88ZRBCDzeRgdZE8eUz4hxDGbDJJA1vNe?= =?us-ascii?Q?J2FIimTQ+WeuJkoq9T5Jwcqiyn6aefWp2r916FihDy8Rr8AR4QvTulTdFbs0?= =?us-ascii?Q?jYq/OFOLVVbx534SvqFKSSv+QOEL7C3uEgFTIxEu0zC3Agoe+Co5nmVPLlXA?= =?us-ascii?Q?/lKQ990xSgxdct10NIXcaa/truYjea367dT7SAyMT+wllMY0lKFfMhXssSGe?= =?us-ascii?Q?FEuIaG9TXbQF9J7GLlmkPKg7SDp+sFx9/U6+uEOfPXoYb5CX91Rs/zSmxAVe?= =?us-ascii?Q?gA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1466e2fe-1583-4a27-3a2d-08de2ffd8e2f X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:19.2904 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: SPIelBIMPY/HoeOAjyxK1n3k4g8JW8Bcgo5ESxyJbDFZWqOKPuxAjHYoFJye9/psBBTwQUyVIqSqUuDnSMFxS5t0tyj1oEyEFuGmqm5WSAQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Implement device-specific RX trigger handling for the rx_trig_bytes sysfs attribute on MXUPCI parts by programming the vendor registers directly. Changes: - Introduce a per-port structure to persist the registered line and the RX trigger level, so the level can be restored on startup. - Implement uart_port callbacks: - set_rxtrig(port, bytes): program MOXA_UART_RBRTI and cache the level - get_rxtrig(port): return the cached RX trigger level - Use the cached RX trigger level during startup instead of a fixed default, while keeping the initial default at 96 for backward compatibility. With these callbacks, writes to rx_trig_bytes update the hardware-specific register and the selected threshold is preserved across open/close cycles. No functional change for other 8250 drivers. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 61 ++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index 0eeaf0fa1538..15565729b7e4 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -86,10 +86,15 @@ #define MOXA_UART_RBRTI 0x06 /* Rx Interrupt Trigger Level */ #define MOXA_UART_THRTL 0x07 /* Tx Interrupt Trigger Level */ =20 +struct mxupci8250_port { + int line; + u8 rx_trig_level; +}; + struct mxupci8250 { struct pci_dev *pdev; unsigned int num_ports; - int line[]; + struct mxupci8250_port port[]; }; =20 static unsigned short mxupci8250_get_nports(unsigned short device) @@ -150,6 +155,8 @@ static void mxupci8250_set_termios(struct uart_port *po= rt, struct ktermios *new, =20 static int mxupci8250_startup(struct uart_port *port) { + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxupci8250 *priv =3D pci_get_drvdata(pdev); struct uart_8250_port *up =3D up_to_u8250p(port); int ret; u8 efr; @@ -167,7 +174,7 @@ static int mxupci8250_startup(struct uart_port *port) serial_out(up, UART_EFR, efr); =20 serial_out(up, MOXA_UART_THRTL, 0); - serial_out(up, MOXA_UART_RBRTI, 96); + serial_out(up, MOXA_UART_RBRTI, priv->port[port->port_id].rx_trig_level); serial_out(up, MOXA_UART_RBRTL, 32); serial_out(up, MOXA_UART_RBRTH, 96); =20 @@ -309,6 +316,43 @@ static int mxupci8250_handle_irq(struct uart_port *por= t) return 1; } =20 +static int mxupci8250_set_rxtrig(struct uart_port *port, unsigned char byt= es) +{ + struct uart_8250_port *up =3D up_to_u8250p(port); + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxupci8250 *priv =3D pci_get_drvdata(pdev); + u8 efr; + + if (bytes > 128) + return -EINVAL; + + serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); + + efr =3D serial_in(up, UART_EFR); + efr |=3D UART_EFR_ECB; + serial_out(up, UART_EFR, efr); + + efr &=3D ~MOXA_UART_EFR_PAGE_MASK; + efr |=3D MOXA_UART_EFR_PAGE_1; + serial_out(up, UART_EFR, efr); + + serial_out(up, MOXA_UART_RBRTI, bytes); + + serial_out(up, UART_LCR, up->lcr); + + priv->port[port->port_id].rx_trig_level =3D bytes; + + return 0; +} + +static int mxupci8250_get_rxtrig(struct uart_port *port) +{ + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxupci8250 *priv =3D pci_get_drvdata(pdev); + + return priv->port[port->port_id].rx_trig_level; +} + static int mxupci8250_probe(struct pci_dev *pdev, const struct pci_device_= id *id) { struct uart_8250_port up; @@ -324,7 +368,7 @@ static int mxupci8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id =20 num_ports =3D mxupci8250_get_nports(pdev->device); =20 - priv =3D devm_kzalloc(&pdev->dev, struct_size(priv, line, num_ports), GFP= _KERNEL); + priv =3D devm_kzalloc(&pdev->dev, struct_size(priv, port, num_ports), GFP= _KERNEL); =20 if (!priv) return -ENOMEM; @@ -346,6 +390,8 @@ static int mxupci8250_probe(struct pci_dev *pdev, const= struct pci_device_id *id up.port.throttle =3D mxupci8250_throttle; up.port.unthrottle =3D mxupci8250_unthrottle; up.port.handle_irq =3D mxupci8250_handle_irq; + up.port.set_rxtrig =3D mxupci8250_set_rxtrig; + up.port.get_rxtrig =3D mxupci8250_get_rxtrig; =20 for (i =3D 0; i < num_ports; i++) { if (serial8250_pci_setup_port(pdev, &up, FL_GET_BASE(FL_BASE2), i * MOXA= _UART_OFFSET, 0)) @@ -354,15 +400,16 @@ static int mxupci8250_probe(struct pci_dev *pdev, con= st struct pci_device_id *id dev_dbg(&pdev->dev, "Setup PCI port: port %lx, irq %d, type %d\n", up.port.iobase, up.port.irq, up.port.iotype); =20 - priv->line[i] =3D serial8250_register_8250_port(&up); + priv->port[i].line =3D serial8250_register_8250_port(&up); =20 - if (priv->line[i] < 0) { + if (priv->port[i].line < 0) { dev_err(&pdev->dev, "Couldn't register serial port %lx, irq %d, type %d, error %d\n", up.port.iobase, up.port.irq, - up.port.iotype, priv->line[i]); + up.port.iotype, priv->port[i].line); break; } + priv->port[i].rx_trig_level =3D 96; } pci_set_drvdata(pdev, priv); =20 @@ -375,7 +422,7 @@ static void mxupci8250_remove(struct pci_dev *pdev) unsigned int i; =20 for (i =3D 0; i < priv->num_ports; i++) - serial8250_unregister_port(priv->line[i]); + serial8250_unregister_port(priv->port[i].line); } =20 static const struct pci_device_id mxupci8250_pci_ids[] =3D { --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022074.outbound.protection.outlook.com [40.107.75.74]) (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 1789C280327; Sun, 30 Nov 2025 10:45:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.74 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499533; cv=fail; b=DItV+rIF8lgL38TpNS3XDmE5/t0lRlnbNWOQ03/HhV8P7DAcJIeOK+O2ZDGaZY8Hd6wTJMl8RAEAD/z8iPmsN9MhgcWL1DukAT6/U6Qw9pmDsOD/S9wHb4DGroZIoHNQgiXyg98JLeyecTb3n+0EtoJJdq2txpW8gmHdYhxanwc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499533; c=relaxed/simple; bh=WnYPHzx8GoslZvwpTuVnklB0FbNJpULMR6V/Vhun64I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=qnVgYngfTrdi9k64y9audGFDELeuPRLpbLS8MfIaAhGKvWpKh1M8+DvBGqE+96B/HlTfSyeYhvYle9StVdA9xu63gwDv1CNHhwFvlRUIkHWQDdFSwmq9Ug2Hhm8pSQqeV+RKqFZSuoQpnvYwrEMRj2PbpfUJ5jvZPP0iOOcJGtI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=VVDPB05F; arc=fail smtp.client-ip=40.107.75.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="VVDPB05F" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=aLPlSf8BX3BLze/BO7DyQTRxHaNvrzEoOkH7cxMxJIRhzmhfW+EoYCMTqi8oboeNkVz2dRZXCg+TxDa+IrNuHnxrGVxkwEuTbVGEKYM9AdEOkQqkWi+KCape+B0BKQCQVIjMkMxaC1nDjWGFfRsGmgHO9mMxNGF9xJMxZ8cCbrtsoPHYhcPGHr0PoUEb9wEoj6dGsjm+InCHtebCly5Ix8seLl1Q0j+Wxfg3jMVkVUDMNOr/T5Ay9mhwYqwSNykV7GNF0jNMD/+wqzB2rx9IL6SXeOdpIz3K9krqBpTzSnvtyg+o1vC39CKUfMsNwwdxL1SBPZugUvwMGaee3f3bvg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+TBsCg3OF/wkF30PTjVVTtfKToop1st7HwYwqiL9wa4=; b=K9pVfYz8Sq9kKJCwvOFw7I0rzlpfu2N3E4uu4r74TfZOKp2WZAWlkVXut+bu6JzHdquRkBQCe6thvNHJxIBbRNTEwJ4bslwgJhCevOrELv6rf97pOhwreRHNagrJwtOQOS5OBdOo89zfQ50IaS+RjOF0CnvwGdhXvH6DTTmeWM3wDNiznhygx/WbF649cUHd4u/yccEb7RG3teEoxOXe79/A4My9yN//et+CXt2tYb//X3zkHMj6vNo6kU8re7muyeY/dF2+8v6zQ9wGwQBMfPjvqvWEsiFYiea5GXDvWZtGq2ns3Tw2PO6AZeYbVL5Tm3rvu6edlgMYflV825dy8w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+TBsCg3OF/wkF30PTjVVTtfKToop1st7HwYwqiL9wa4=; b=VVDPB05F10pD39oRLdFO/jHOiXqmyOz6zuBzd0wCks3hXMfl7mWWEKE79UiU8SUnxdvuIGvk5dCEzd1Sr5hPj34j5NjlM9XM1hi6tZjxIX71KWIU5JNWgPYo1g855iNbYYEoh83HWT13SUOh+CPYFGUhDvc1vZILiDX9XBIHyGw= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:24 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:24 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 23/31] serial: 8250_mxpcie: defer uart_write_wakeup to workqueue Date: Sun, 30 Nov 2025 18:42:14 +0800 Message-ID: <20251130104222.63077-24-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 8580360a-624e-4d09-bb03-08de2ffd9134 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?uLKqz+3+bl/TRR4txI9DEM9RjW6UwYUMiLxxXJ+Tw/EqjNcQA4NJvPEVUoky?= =?us-ascii?Q?EJc5j047i5C7KSLqc/EMDg79PQI3ytpFaixnoHAA38ntXaoEcgcTj2nATg3m?= =?us-ascii?Q?IJ0x27if10BE8Ql4GZKA6eBM1By4A2vaIJjijvmJirMMnRWyiHSQ0C4Xv40o?= =?us-ascii?Q?FOHLfMR199ZF5WERwtVXqlBafMn76YJmN8283t3CnAKXjVYa+zHeLrqnsrVZ?= =?us-ascii?Q?dFMijQnXKe0eS/m8ZUiPIubZiGs5YXseVjbCYIjPuDN8x/9vh0lsJLo/h2qa?= =?us-ascii?Q?Ojgtbh5tFHl50vkCy46LnBmEzRzZ5K+DhQvwp/LrkUNUf5sA51pVQXrdhJ3G?= =?us-ascii?Q?QkZCatds5svpJJAG04FqYOxePP6LUhTP3mJt2kOuRwbNCYIDLXHc6TuBoahq?= =?us-ascii?Q?e2mbcYbpD6ZI/+Ta3WvuJ4+Bs4O5jHagnN6th6CQkrQ7hF7xL1sq5McNBTjS?= =?us-ascii?Q?3fDdgdF5Mq/ma75dGYGyK6vwbbvVihIIOe1W96jOneL9WXjpSnM1R76yOi4p?= =?us-ascii?Q?jzjwW+xmCEgWYOoMVDwHmiU2E9449HNNzyYjJZ2IpFeuK5F8R81h8mJBJB2K?= =?us-ascii?Q?n7vmev5xh8lDQHxoDXec1ailhpmFAak7A269fe8LP3gO5ri1QoE9TVac20Zb?= =?us-ascii?Q?cGLtwg9qMFryzH0GFlptBPhNci+QiXvNBBU6LTf1UWCzXUX1qX0P0vH8M6Pb?= =?us-ascii?Q?+Cu9BpkLddr+6W0a7S+sORzOdlNF6CBaFuBKnSFiaKbU07UT7NuGVFtjhjxa?= =?us-ascii?Q?bDVw0YHLsSMj1VaRE9mMwaAPSUAsIzCRf0YiY4VYWMoRaGeoQQBhW4awpOit?= =?us-ascii?Q?OA1tpe4FmDwTVhBk8CK+vlX+wO9gw/Vxd07UvM0+CaR1KXJv9AP+yi310Z2q?= =?us-ascii?Q?e5gC+16hS8q8keA3ZfGV/FWQ2TMLP9EW0ZuWpxPrWnR6TiWmuK8vmUur6bqg?= =?us-ascii?Q?iIItiuuTqukDmYRc6hdHPuChTNrRCcGwFkUByr3yUqZG47TvcFea5m0aYf9u?= =?us-ascii?Q?gTZMHBRlKPCZjXRRJw1dBWVZp4tkNKn35+idK8S8kw0TTRBBMw+lclaO+i7L?= =?us-ascii?Q?2DD8pF02ZIiYHqvPnwQsWF/41BcZa2xZpf0m5kwYlpwhvJupH0mdCaib1Gmx?= =?us-ascii?Q?+hk1KAy1BNfwXw0C7jkd4q6JXS+G/XjKAHlSTIniNO5s9L4RHEdm/HEM8uLu?= =?us-ascii?Q?71lQpeQEn1Qy/rjRPPh7yPthk76qPgZzZhDJKQY3mDYcjX1c8N+AfZFNlY69?= =?us-ascii?Q?wdQMqKbRY+8pyrVGO8nDyatEku+FJlNuMLCHB1XOviqiwH1mCmvw6Kn6o5ZF?= =?us-ascii?Q?IjNONej/TLi9rWWrKN5zjCnF84I5rjZnpBRX9caDEMgDbPiwqH0P/ai8e+kp?= =?us-ascii?Q?CQVaKYpKvigHTu12e7P9zz7yQ1nKr1pIu+j4dWLamaDUB2kTjXEHAKj0fT9k?= =?us-ascii?Q?KeLn0BOfTe1uh9PdgY21z6DEKFuMBpn6FaUOom7DRCXSEHvHWxc3kYj0KkiM?= =?us-ascii?Q?MABy5wInC+3SNGQkeDO5Sd+vxl9bi4iR5f05?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?pqrujw67t7N7bMaZWwIDw0cQ7OkjsPELHyW59Vpnn/2KN98iZ0J1oWNWcPyV?= =?us-ascii?Q?9re0NeqD//wQOTcg0t6SmLb/oUDo8mg8pQvHQX4cWqRx+XA8Brz/wio2G37F?= =?us-ascii?Q?N3Y+5jpDXJmU1z70iYFRxxtkWRTe9arEBpx3UOaf/kukIoo4iLzTBwSc71CC?= =?us-ascii?Q?gM5dFntZURhFgFQeio+Y3FYemWW431y3bmBU9oTpUyOQz6wzhHyAHiRSpXWX?= =?us-ascii?Q?602IPYYA8lntWw8bOJUA9Qc/Rd4mylIpia5S+y6fey/Ti2MRy37uoy/AR3Tu?= =?us-ascii?Q?nJQnnRTSfSevK8/2HK4ZBcBC2BzyADMTh6AQM1tBIQmqjylZEVgBxwPLhUlE?= =?us-ascii?Q?u/aaKZ9s5vSY60/75EV8A0Z642+aoVMzYTyxz6oF8uAEZblD+r4MjL3c8n88?= =?us-ascii?Q?gP1+DbGDqiSHcSzHZBpSEV+bT+YjNHM1d4FTqcUtfFGpsZLXHuHgNBSNCwTZ?= =?us-ascii?Q?GF+4VthFedcJdu0Vrz+9sRj03SDiojCmbq02Db6v+pndO63TSbheqeWiDK8K?= =?us-ascii?Q?bLNHkmulFRZU3qSTi0njW27HkccLLc0JfYTTkirL4SPLBuYp3wrr3IR50oSR?= =?us-ascii?Q?Qh8OnAx4AVqb8wX2OGYU/9sxWenX1xT9sNQu4cKxhJM752eAmQdWFNpbE3dZ?= =?us-ascii?Q?hfX6F9n3W85Ic1xN4EKd2lBBMqI2o/twnQyWCzWKovGv5Cd5D1caoDFB7O7h?= =?us-ascii?Q?5x/BQLGcPBRQC14a4tJ75VyYLeDl9Uip0q/lKY1uopSyfHrxhaLAAYBGrIi8?= =?us-ascii?Q?nm9oaBJjWf5Yrf08XCcfuhMyuGAtBab+KQ+c19ZEUEAwJnn+f3YurfUTO7vG?= =?us-ascii?Q?UZ3eGkBPIdYHk5YsZxREDCBYmPORXw3Dqp8kDtXNrxbgr044j1w9wlGHoaL7?= =?us-ascii?Q?iR0Koaf2QzhIZo4fG+yWDdicybRFr1QA3qpiMdxmWAEs5Ms0WD6IyXRtLxvg?= =?us-ascii?Q?8y7CPWIp9/6uhC/aS/gMCjksSiYBXEk2vaCi/4bSp5aHg46BMMVKeHR1G1dO?= =?us-ascii?Q?vKccRPaw90cOfCU+zQdBk66yiuotP8dVN1QdJMPIZmDN7PNrk7mB35O5Px+m?= =?us-ascii?Q?KIGwYXm2YtDyA2XaMst8NwEACkogOeSjgRjsPDuTN7VSRXH+Kqo3wYY0mobC?= =?us-ascii?Q?7KUue3T+cel/PabloPse67P7uYQeUCuXy5LhnJoTBkEBwogRAirG0B3m3iC5?= =?us-ascii?Q?55hJ30qto76OvgVjQ7hyL3UMSMw8extnllBIfsfqd9xswAyQoEneRv1fnZ1o?= =?us-ascii?Q?TTuMw48WQHpsMaWh2ymrTnxk7pFWPeGhYe7txvf+QykHxpIXKG1+8TxX7t+X?= =?us-ascii?Q?rlt5ZIuixLdBErLbjkDIFOyjxqtZ7BBmZKfhW3EX53gAWp9iFnZbdWjfYWpT?= =?us-ascii?Q?ebowbNDe7VhYjP++MuNyJaRtsw9uXsN8xieB1r+3BcKBCCrxA+lsyHLubfFm?= =?us-ascii?Q?wyOgz+vFmNKUj4rZWtZli+7USMspCc27WsvdO4K/eVDsB5axobDsD73qfX5h?= =?us-ascii?Q?ZZtdKuOYgByJbTMSKIvuWWsG6pLPHeSjEBf2qHWTQew75F1gEOKXPyB9X3ny?= =?us-ascii?Q?FV/OM2gaJIczTCFCVCJv2AKOP+Vu8q/9YurExxFy3ZJQLPuwtRxvhHdJIOWb?= =?us-ascii?Q?nA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8580360a-624e-4d09-bb03-08de2ffd9134 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:24.3525 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5lRn/rhQptH4pNi2kjhxHz6ZRGsL8mRk805GMrGr7x7T/ZtA/ITCYjbJzhlGDZCm6Ra8rt90x+MJOFu+62ODTR0bykrHAT/lnjBfPvu26F8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" When the TX FIFO drops below WAKEUP_CHARS, mxpcie used to call uart_write_wakeup() directly from the interrupt path. Move this into a per-port work item so we avoid doing TTY wakeups in interrupt context and reduce IRQ-side work. Changes: - Add per-port state (event_flags, work, cached uport pointer). - In tx_chars(), set a TXLOW event and schedule the per-port work instead of calling uart_write_wakeup() directly. - The work handler test-and-clear the TXLOW bit and calls uart_write_wakeup(). This keeps IRQ handlers lightweight and avoids potential locking or RT latency issues while preserving existing behavior. Note: removal path must cancel pending works before unregistering ports. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 32 +++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 04b9c9ff5cbf..a0deb464a318 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -93,9 +93,14 @@ #define MOXA_EVEN_RS_MASK GENMASK(3, 0) #define MOXA_ODD_RS_MASK GENMASK(7, 4) =20 +#define MOXA_EVENT_TXLOW BIT(0) + struct mxpcie8250_port { int line; + unsigned long event_flags; u8 rx_trig_level; + struct uart_port *uport; + struct work_struct work; }; =20 struct mxpcie8250 { @@ -332,6 +337,8 @@ static void mxpcie8250_tx_chars(struct uart_8250_port *= up) { struct uart_port *port =3D &up->port; struct tty_port *tport =3D &port->state->port; + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); unsigned int count, i; unsigned char c; =20 @@ -352,9 +359,10 @@ static void mxpcie8250_tx_chars(struct uart_8250_port = *up) =20 *(port->membase + MOXA_PUART_TX_FIFO_MEM + i) =3D c; } - if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS) - uart_write_wakeup(port); - + if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS) { + if (!test_and_set_bit(MOXA_EVENT_TXLOW, &priv->port[port->port_id].event= _flags)) + schedule_work(&priv->port[port->port_id].work); + } if (kfifo_is_empty(&tport->xmit_fifo) && !(up->capabilities & UART_CAP_RP= M)) port->ops->stop_tx(port); } @@ -473,6 +481,14 @@ static int mxpcie8250_get_rxtrig(struct uart_port *por= t) return rx_trig_byte; } =20 +static void mxpcie8250_work_handler(struct work_struct *work) +{ + struct mxpcie8250_port *priv_port =3D container_of(work, struct mxpcie825= 0_port, work); + + if (test_and_clear_bit(MOXA_EVENT_TXLOW, &priv_port->event_flags)) + uart_write_wakeup(priv_port->uport); +} + static int mxpcie8250_init(struct pci_dev *pdev) { resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); @@ -533,6 +549,7 @@ static int mxpcie8250_setup(struct pci_dev *pdev, static int mxpcie8250_probe(struct pci_dev *pdev, const struct pci_device_= id *id) { struct uart_8250_port up; + struct uart_8250_port *new_port; struct mxpcie8250 *priv; unsigned int i, num_ports; int ret; @@ -590,7 +607,12 @@ static int mxpcie8250_probe(struct pci_dev *pdev, cons= t struct pci_device_id *id up.port.iotype, priv->port[i].line); break; } + new_port =3D serial8250_get_port(priv->port[i].line); + priv->port[i].rx_trig_level =3D 96; + priv->port[i].uport =3D &new_port->port; + + INIT_WORK(&priv->port[i].work, mxpcie8250_work_handler); } pci_set_drvdata(pdev, priv); =20 @@ -602,8 +624,10 @@ static void mxpcie8250_remove(struct pci_dev *pdev) struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); unsigned int i; =20 - for (i =3D 0; i < priv->num_ports; i++) + for (i =3D 0; i < priv->num_ports; i++) { + cancel_work_sync(&priv->port[i].work); serial8250_unregister_port(priv->port[i].line); + } } =20 static const struct pci_device_id mxpcie8250_pci_ids[] =3D { --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022074.outbound.protection.outlook.com [40.107.75.74]) (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 87F23281531; Sun, 30 Nov 2025 10:45:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.74 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499535; cv=fail; b=CX+5gQkp+LlxagkGlBMW7Ueb6IBXhScuwcrWhuhsHJVmh1vVi7QrzA+l8PxNFU8mkMLOqV/7s6i3zW0D3DKgWUDcDhiE8TQSx9YdeJOUrDRBaNK6MEPyfwjKZKPDn/2W9U9yt7iJWMYdIE1wFgSw5hcQhxLtkRHxLBQzPt7maP8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499535; c=relaxed/simple; bh=hieK/xKtI0sx/8wsa+HuzruERgLxpGDcjyk36RosXlE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=QOOhBVOd2uryxRCbXtys5R+tLEk4xx3j2+DqbGQznzdMlE3GEstKqZJXv2euO6z9gkMnIhlu1NJ5ezAWoJ/uO/dP9/Dbjpaa5DJvoHG4h2bD1cAN+aqH9DNbwXDHF+QbLc6x+E5JiD5CVGFMrRCu826AV2G0SV0L0yCH3UpyebE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=I9raVLGK; arc=fail smtp.client-ip=40.107.75.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="I9raVLGK" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HQav4YZC0voG7oLTKayx8rR21kF2+XQUQt3wK7TvrdzhIxdE4aw3DDERQKbXXZCy+gXWeo0UYypKH53w1qzuXT7UENajry25d6D5r7KV7/mj8YTpbG008Ay3XLGvdPmDM3qX14PMeL+szmYSK/inWtW8GAzpXtWWjpqCqfrjcRuu+11Fb88HHtzRdx8nO8YBLGa9Q3fdsfDTIi0QHac8lbYjTylmyDT29OTju8YlIrjzl0HrJzlBZd9/D+bsPrLj8CjgnmZ8vmFpQ8o/+DjIX8WNA+g70dEwCHKqZCbF/eEY1Yz5s0LNwkyuS1wBOGIDZsgvrWDt4OjJ746TGBdreg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=YTIDw5uRbQBxJ3d9i0MrDI5jji7HyC4SISMsS3aj/Yw=; b=euv2uyJxHsMs/prkNG/XSh0ny9N1b7o0qaCe2nVvZvzm9hxLF4Own1ioLuUcyOOfogV1D/NdT1+TCbQtHFSfHWYiZGgFKnHoUhlvBmisoWX4/0S3u1i+4RB4K+P4Nk6fn8zWsAV/d4VNfYIkLOKw4Ig0UP/2SOp+DzBPuiiD+1Bn1jkQyUsecfR29Nokp5zeB3l3D08XK77hMftyeX41uu+IpNEzGb/R2x3m+1GY7jCLT+4i3kiKrGM2Ap2i6vWY6BpQVoyjhcx0k+EK1wwVL76wzSgICD6G98N6BhYVs5Xfq0MXr3+ly67h4PRHBTaEzpmWNmt6Z8+AhiLNaL8nVA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YTIDw5uRbQBxJ3d9i0MrDI5jji7HyC4SISMsS3aj/Yw=; b=I9raVLGKyzLxUuW+uYNXQX+/KjtJHeX75vXRDOit2ooNCYIj68UEpSTjta4uFkVxfHE36Foc4szY0Rj/wfsvA+zzCO3SL2iLeiucszOUNByx0indVZZWyDPUEZbU/tnR3INPr3Egnb6UIPfP/LKOwnlcP/WqhNXM6rCbSCLD6h4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:29 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:29 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 24/31] serial: 8250_mxupci: defer uart_write_wakeup to workqueue Date: Sun, 30 Nov 2025 18:42:15 +0800 Message-ID: <20251130104222.63077-25-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 2acc3762-c77f-4642-32b1-08de2ffd9429 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?mYqjUWBv9UB+61MBRtM3YPONBMDhGwErGGdkXXVSy9vtikwvy+3FBIFkw4Zk?= =?us-ascii?Q?ufhxb5Om3ljoH+PEAOPKnds/Ic3BbiWGLZW70itZof8vvcn3MLbRj09AQ6VE?= =?us-ascii?Q?O2LzI/mTYAD20NrPsZEVwWynpII8Qc7K94cImaeHw7MX7fHocLjsoXBBSYO1?= =?us-ascii?Q?f8yJwt2kNFDYKxeZkf9pOn3WDXlzugmvCzP+xh2KCdKqqmpH9c3OTDZNziIp?= =?us-ascii?Q?SPh0VdDjUlaLoyVUv1t3fazlbxJBDp8IYV6rOXADWIvkP1uGrsQuszHRSqJz?= =?us-ascii?Q?pOLrq0N1rS/gPHJn4VsBnhJtn9qrhFl0OSv2hd05IuSSpWF4WmJckRyk8dCW?= =?us-ascii?Q?GWo3DeF1LHGIbUA47RE0512TtrC844sZ16qwOarP1QmIf/nY00XKDaIOQFoN?= =?us-ascii?Q?OEx8I1TW5NvNLr8P69ANYSKx/d3PYP2abdoFUVRvsGis8r3xxbohvlMzix6l?= =?us-ascii?Q?EBiMIU2Z/kqVoYLfSu0gFVDdV9vd0kAf6ByvsQLq6SzcW4K5Oc3hA1JEQ1Hi?= =?us-ascii?Q?7D94oBfwN6Wdw8nD9lEPd1OFprxN7LcSpma3WJ4HwR5qzmSGlpuiRy25aRCn?= =?us-ascii?Q?IU7ctUKzqaZkZbnVF6a/ym0J8ByQBO3RQhb3CR0xUzrMytF0+iGPHZw+tnot?= =?us-ascii?Q?k7Q608fr4QGyicWI4pj1zVkkfLQzsu8f4mEpeeV7LLXoiCQpt1OP7kFvPs9C?= =?us-ascii?Q?tzwmHpv680BWxPiVAxLSgT8p1qNNJAT2F9+vvbmaHTxvQFxa4kOQJz4kmk92?= =?us-ascii?Q?VPAKxaU3CQPTg64elVMa+m1BRaFYTN9dIkqwDyzm9ytKkC0Tr+ya0mNtGpob?= =?us-ascii?Q?g7XaR6BGqUInljYbYcCzHt52V+JS1wJ0GU1fsfBHYylmsFoJezjvQobXQHmD?= =?us-ascii?Q?EiZtlYgISgt1IhjID5Id8HJvimsRzOC6Jot2wGxlDdjodosV/cDsCdgWqlx6?= =?us-ascii?Q?0lU6tX3Xq5JXIuj4zU3ByhFtwIK8TpLLoZA9DJVfkTkWzisn5v4VuG8//gOw?= =?us-ascii?Q?W2u7GBPqCQwV/q2ooH+zOJ3IksZjw22h1CzFqKIWeq3McFvzm0UDBG/ledd+?= =?us-ascii?Q?NCA3nfjp5flBBQ6oAUAfVBVI21RMoNs3hiHxAsuDURmLGKcklrjOBZx5LCh7?= =?us-ascii?Q?lPzIJDCQAB8jdW7EDubew0YolZjtcm7VclfEwdReliNipZfnX7e1Q2ftk03Z?= =?us-ascii?Q?60ETgx+3hlGTZISPJPqFnsFe5hXIJ+SI7fk6gLDlzBXRucFpevVlXs3YS3k+?= =?us-ascii?Q?ndruyEEB3bw447d0oaK4C8TKvw0JpRBCMMJHvvhukX7LA06Ia3jZ5o9F05Fd?= =?us-ascii?Q?4UH9PpHiQE1MKsJUCKnk1cqj6jrAKEMq8qdwXGRO1rToV9mB3YzWTCivvqz6?= =?us-ascii?Q?sfueGOAaClUepfdwkPAbkB734HALqbxz06G2BsSY/ZjyP+FDjaMPLh3s12R7?= =?us-ascii?Q?ui2Gx0T1f73c3e3ALrwcPW98M1GP52YjcUr+HmIc/mMUmf2KCyGDiDix47oN?= =?us-ascii?Q?gKfuQBDEMUYfPZEZJUXrWAJPH0SaOMQkEemY?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?loaWrLx7LKA9UIPdgmK5cuKEBBNB1y2+ZKF0NqEGzap8uUaseeNi6H6RStXc?= =?us-ascii?Q?VCWD8x7Tr757jlNMzxsO4UeqPEH5g1eKTwZfKg4YpC98I4oQGweHmf83Mwoz?= =?us-ascii?Q?MecPFuwnBhW9mI8d+vPUOPyfvJiTfLqR0ghrKRYUXZP+U86RQW61pUbvq0yv?= =?us-ascii?Q?k2aIpvmC8ZoDyEjJpxyiq8tRYrVlqtrd+EY8mqj6I6K7tv7WNjRhCd4SOQtl?= =?us-ascii?Q?MJsLQsgOkmXO+r6sqlC6eZFG2+NnDnUIPHyDBYx7dJHcQAZ04nLRzBMs/sud?= =?us-ascii?Q?NwUlOaoAgDMnyTf+d2etJhxVD50ioCG91A+zptVVk0LD0/T6TB92T0oEDkil?= =?us-ascii?Q?Rnj8GwUnZPE353SLsso8J7SEkeFthsN0ZTX9onNXD44dSfiogTkYb6ZpyBPe?= =?us-ascii?Q?QMu9bFgWBnB499ATEpL4hYmnvVBuJNRGjg//CNbWcCpzPKmfB2nymgDWbDxA?= =?us-ascii?Q?y7VRclp2Z6gXVF02Ef3vmE2W7N7aULbX76e7ssWjZ5NoYabiJ6/RcHg/5zBA?= =?us-ascii?Q?0h9tRC0DOflC2XGyYLIdooqWUI3GsqL6Uq0V9vjsIVKPT06dfrRhGoohgZX5?= =?us-ascii?Q?GbsE/lwMZXTezmx7EJthVKiWnXTCVNqx0uaWIfeRTPly9CrGHuoffjH3redj?= =?us-ascii?Q?9B4wZl+by+pEgwI2XcpQ4qfmU+SgbFFVu+qU17Rf6jra3VPW2ILhpBX5EWWz?= =?us-ascii?Q?52HINndS5AdMDbRhicdP1QSzDzpDHNYBFA6duS7PGv4H73KxMji4W/ucJvJX?= =?us-ascii?Q?kZBGxIvgbhW1Ud16aZCLGd/GiLLdvwnqH4553TxBHe2XeYGp9RMd5X64zjJz?= =?us-ascii?Q?Xg3/R5y7PTifIB6dybk1SsPKMCFv/kaceHZFyeUIbuFlA7WrjB2d3yLBctMX?= =?us-ascii?Q?V4dnkLAxbRGLEIwIx3Z+q/K2Bx/OmzLaNkyy/OCLplEhXeCFA/INDL2Lyusi?= =?us-ascii?Q?dpTVBnFL1z4jN7DmLOJo7A2uqqtW3wh88RYDg9UZeqhvMXvnv2QS0YcqsiFx?= =?us-ascii?Q?qiX6nCcgVLNJT9AO8DfvDNdyVO+sTgo+y4eKhJCtqeC2jm3/xjDHGbnemCEO?= =?us-ascii?Q?YakpPCFXQ42TwmVeXNQZoa36TPo1Vb6e6y7uWMzAupxDhqn6fNo/9xq91Esy?= =?us-ascii?Q?w9XLy+EJcz7bqkqe1HeftJgkMm2CUUm7hPD9yvwg99ObxHFmYtqsJsx7AT23?= =?us-ascii?Q?NlGrxJymx67yZt7ErO5f6VXqIDh603tRS0lT63LeoSifasQ3kkrnKlfDesDi?= =?us-ascii?Q?NRT69pa90pSkD1is47fjVAONCzAc4FJB0eXMgsMymICJVqUVb8+0hSagepOR?= =?us-ascii?Q?+TILCmBsCDNS4+r+r29oq7VKxzayc/FQ5cVFX+Gtqj0Lz5+jr+gzysNLdlPF?= =?us-ascii?Q?KI4inOy4ugWZ4e0yjVaf2CX1eIT+VRc7UJzBg1w0DFMyG+v1lfOyOBUVg1LL?= =?us-ascii?Q?QdP5q3iJ9geCNE5ciXFEgA7L+OINK2y55Gg5GIq5BfvmywB600xcOXoUNFHr?= =?us-ascii?Q?HxOh//DrvfyNk2kDAWPSUVV/NyLPTCXxyox4zH5cRpdsRoTZK+CJfFVzN7RK?= =?us-ascii?Q?+lksrofmXw4hRq000Cvco/9qEHTm1fBIgrdPvQVg2mWVLdGgBrg5mpYmW4VQ?= =?us-ascii?Q?Bg=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2acc3762-c77f-4642-32b1-08de2ffd9429 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:29.2914 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: KukzxK6zfGEFptP8J/erWPI48CIGV8jiYLxTmtPpA+Nns8s/8XH3PUpxVkITcEsC31CbftQd7NqKDFY+crlgNrPs4sBn/db42nUPotUYemw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" When the TX FIFO drops below WAKEUP_CHARS, mxpcie used to call uart_write_wakeup() directly from the interrupt path. Move this into a per-port work item so we avoid doing TTY wakeups in interrupt context and reduce IRQ-side work. Changes: - Add per-port state (event_flags, work, cached uport pointer). - In tx_chars(), set a TXLOW event and schedule the per-port work instead of calling uart_write_wakeup() directly. - The work handler test-and-clear the TXLOW bit and calls uart_write_wakeup(). This keeps IRQ handlers lightweight and avoids potential locking or RT latency issues while preserving existing behavior. Note: removal path must cancel pending works before unregistering ports. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxupci.c | 33 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/8250/8250_mxupci.c b/drivers/tty/serial/825= 0/8250_mxupci.c index 15565729b7e4..a19880b99236 100644 --- a/drivers/tty/serial/8250/8250_mxupci.c +++ b/drivers/tty/serial/8250/8250_mxupci.c @@ -86,9 +86,14 @@ #define MOXA_UART_RBRTI 0x06 /* Rx Interrupt Trigger Level */ #define MOXA_UART_THRTL 0x07 /* Tx Interrupt Trigger Level */ =20 +#define MOXA_EVENT_TXLOW BIT(0) + struct mxupci8250_port { int line; + unsigned long event_flags; u8 rx_trig_level; + struct uart_port *uport; + struct work_struct work; }; =20 struct mxupci8250 { @@ -251,6 +256,8 @@ static void mxupci8250_tx_chars(struct uart_8250_port *= up) { struct uart_port *port =3D &up->port; struct tty_port *tport =3D &port->state->port; + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxupci8250 *priv =3D pci_get_drvdata(pdev); unsigned int count, i; unsigned char c; =20 @@ -271,9 +278,10 @@ static void mxupci8250_tx_chars(struct uart_8250_port = *up) =20 serial_out(up, UART_TX, c); } - if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS) - uart_write_wakeup(port); - + if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS) { + if (!test_and_set_bit(MOXA_EVENT_TXLOW, &priv->port[port->port_id].event= _flags)) + schedule_work(&priv->port[port->port_id].work); + } if (kfifo_is_empty(&tport->xmit_fifo) && !(up->capabilities & UART_CAP_RP= M)) port->ops->stop_tx(port); } @@ -353,9 +361,19 @@ static int mxupci8250_get_rxtrig(struct uart_port *por= t) return priv->port[port->port_id].rx_trig_level; } =20 +static void mxupci8250_work_handler(struct work_struct *work) +{ + struct mxupci8250_port *priv_port =3D container_of(work, struct mxupci825= 0_port, work); + + if (test_and_clear_bit(MOXA_EVENT_TXLOW, &priv_port->event_flags)) + uart_write_wakeup(priv_port->uport); + +} + static int mxupci8250_probe(struct pci_dev *pdev, const struct pci_device_= id *id) { struct uart_8250_port up; + struct uart_8250_port *new_port; struct mxupci8250 *priv; unsigned int i, num_ports; int ret; @@ -409,7 +427,12 @@ static int mxupci8250_probe(struct pci_dev *pdev, cons= t struct pci_device_id *id up.port.iotype, priv->port[i].line); break; } + new_port =3D serial8250_get_port(priv->port[i].line); + priv->port[i].rx_trig_level =3D 96; + priv->port[i].uport =3D &new_port->port; + + INIT_WORK(&priv->port[i].work, mxupci8250_work_handler); } pci_set_drvdata(pdev, priv); =20 @@ -421,8 +444,10 @@ static void mxupci8250_remove(struct pci_dev *pdev) struct mxupci8250 *priv =3D pci_get_drvdata(pdev); unsigned int i; =20 - for (i =3D 0; i < priv->num_ports; i++) + for (i =3D 0; i < priv->num_ports; i++) { + cancel_work_sync(&priv->port[i].work); serial8250_unregister_port(priv->port[i].line); + } } =20 static const struct pci_device_id mxupci8250_pci_ids[] =3D { --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022100.outbound.protection.outlook.com [52.101.126.100]) (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 D24D0295DAC; Sun, 30 Nov 2025 10:45:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.100 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499542; cv=fail; b=jqAX52gXWzI89fSvonFbZFNzSn4MtnMPv4LmOk3Nd1Xiot7AkM7qLUc/L3mNgO/TaXOrk0mj4afLSPfcWW9eHdtOnT+SnzdoObO1eHhYH5b9RkvdBXnwvMZs0YeOOJs/BC73aOJJbVJEFh5xhbrhErlov6JNpztAEkxXdDntsKA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499542; c=relaxed/simple; bh=rE2CNB80WytoZSbJhb7JWpCoLTvfpy2zbK+W09I2VSM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=CAfFOlDvdreSGQg3gGryiEsjfwhe6flKyqrekzVME6eeH8ovsHtwwcVEsxqnwONjtFVqwg1O9OlnjNR1SwTaCJ31AL6QRo7e1I0Tv0he5yNtDLmyXQcZIYK7E3YCouGNiWWWKpeYL6pu39C5CkG7eBOweXsfdtqeCGV9luC6vBw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=VJOywNTx; arc=fail smtp.client-ip=52.101.126.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="VJOywNTx" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KbolpsuKmxiDwkn40SkaexGD6Of+83FOBIsE4f2bAobAGYf74N2iiyJGpVIGeEoBaaFvxlWgrv1ktNApalyiQDGUCGmyKQn1GUef89cqGzs2EkJJPN8tlGcoBW6ADuVUdbehyD1hh0OeKadG7YXcJDSYfhOsfDHFFxsXVBDNO1nYKe750k4QJB7zgEhk9Fbyp0kcqYgnTslA1fn3gYQK/4C2QTtrG1VfoOO7C6nyL7/yjZk4YT5w8UuiycFdOwVlUenMTQ1axCEkpAqpAHbtuRMxc4tll0yiCEgmisqaoVikrJA05La36sltf8wTrbcI++F0+ZKIHtfdwith6JtCOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=mzKeiWkVbzQ6hu5X0/zBABRkUgNwUVxShQb3Zg/w//8=; b=LjGCZrRvY5gFjxMsHdEz3Qnox6yLSM317Ex7odWf/mNxIjuUWOKdtfRDX80WqK94RN0aV63Ej22q7paDn9pmt6b2CRsT/nqE1bxTUz4o5oODZJIkE5Qv/nBEnEk2IymydRS2plLJdUBilWI397WwyyfBUHNAxkVOPfLh16P+7XBIyv8JDb9XG7U8Sdht1ChrFCyYTDRqqOi4hoCd2ti0aSbrTvVYBMiCjOfv5M5Ov2a9yKl81ecqgYvGi85fM7QNzsCHGK4XaoxZPaPImoPVYrQMpbAws1V2+1DE+EWxLxXA44mxE21nX0J9tzflRsheV7lD8UNARFhXUsocAmrMow== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mzKeiWkVbzQ6hu5X0/zBABRkUgNwUVxShQb3Zg/w//8=; b=VJOywNTxRheIVFKqbpjZHilYUTEafKo7E2vNA44seBFcOIu61f9a1Ap+iWzN0zYv3LqvCvQbJJfhPyRYxrZf+r0aDBekQIatNpeWg135vBeYrC7HZpAnOoN+wEirnYTliFtpVDNiRjD+NpfcI8I8srJNOBZAePdNXphTEGGa6fM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:34 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:34 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 25/31] serial: 8250_mxpcie: add basic GPIO helper functions Date: Sun, 30 Nov 2025 18:42:16 +0800 Message-ID: <20251130104222.63077-26-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: ab69bbb3-9cb2-4fc2-cef5-08de2ffd9746 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?Y+SsC/I5BiVvYGwcx4gTr6KA77vR40bUvbzOYlKp92t1PBNMpO2KwMM9dxD+?= =?us-ascii?Q?9MhvVawn/4q3uxeGlxg2OtDnC1WC6XQXvG3/ouRnUUtx7eeLbqGUsFW5dcCj?= =?us-ascii?Q?fszOehhy3OjyYxJtk67p6RW2sLxl/Hzy3gguyOFJzEPM93WN37robvzytGHj?= =?us-ascii?Q?uBpedb5eQs4Vz5whCpE+4cAG9EuQdRFa7AoXAerCSjgP0Q8maw3KvoNjLqh5?= =?us-ascii?Q?6keliCBlmfBitglTYY7IsI7vbc1rc6txbuOkehMXkAryq3/FnKfi2NyjOo1Q?= =?us-ascii?Q?mtIwMzLyNHijf9j2jgbGvlYptq+eu1D5uVtORScLPp7lz392DFWijmER/Zuk?= =?us-ascii?Q?D3o5hNqpVDlkbpc9sQTpeDA7FzfaYWPp3IQ9D4jwxU8VnxNYsTlcSowNKvNX?= =?us-ascii?Q?tmSZEWhAFFRqtCQHUviSCTy/Ian1G7+sGk+wK+gz8G0woRJtPQDOOJ2hXMKD?= =?us-ascii?Q?Bk3JFo3SZxDML5RQdlbz3soJSOURShEaHP+PtNR5y8pxmMQc6SO2s8PjkOWH?= =?us-ascii?Q?TSmXdwYbJ2f9TNxIgoRvYs7TGs/mdJj0RXlmcUiZK4Ipq5F+3Dysc1P1uS1u?= =?us-ascii?Q?WtoVJ89Le7V+0QglNxts3M8bNUflbNXvH+F2vg6LVQagmF+XjtsIgC0uGqLM?= =?us-ascii?Q?vkD0Mg1JmSWETQtURd409Es/pR7X3jJHcv29h7kNXyBr+BZFMRa7V5hkSMDO?= =?us-ascii?Q?RA0X7Y7270NCrmYnKOPxf8QOTMgBbvnGhaEpRVLxjjVrUjaiq1xr9ODeUVO0?= =?us-ascii?Q?d4yAmXNbpT/bC3PEfQGieDDa9qUvIOjY7s6UfyrTefGRdkmdPF4+HkmAZdH1?= =?us-ascii?Q?qlst+dhQPmKvdP0E7QYxrnAr+zWB8AEcc5/EcmFQdUrTuC6ZLqVCV9ZmoM+y?= =?us-ascii?Q?jM0DMFPrhSngBZJptmgL6zeHvyKjMcn9kd7OU2RnDcFqO8IEyjyJ8crBJaUn?= =?us-ascii?Q?+Abbf9sF5lclVC8lPgh8JHHM7TTMwJlQGApIf58VQTx8zHqprL5fH6XQ/oAC?= =?us-ascii?Q?u/tlqc7i/dP4IyUlo6oHzF2u95aPB+hMQwSjNZJWy6RZy3S+t2L2oQ7svmXl?= =?us-ascii?Q?ldMYmckxxu4UO3iuZm4bkWFVWm74K4UmRm50bw0+x+DuoJdUDpU8tQFzR5VU?= =?us-ascii?Q?KhFkgkYK0Qr5SeLun+9UnS/uvcybvUPRRkIXo+83sSKMRypxLKpTbWE+u5Tm?= =?us-ascii?Q?Wm6AlNrkvyfDKuRiQXD5B8kZzaoMz4/Fk67O54Sx6sOGd58F8H1kPfsGGdem?= =?us-ascii?Q?eql1ouwmginxf6se5N2iQZcj9LyV/k2ku3WRzR8/vwG648/6UbCwRZUpinmt?= =?us-ascii?Q?j+cVT2mj5I90aC0HA9zhJm8TuhUlP1T3/LJVIwTjxe6TPXuGpbMPiM/zaN74?= =?us-ascii?Q?lpWERQl7bgdnPyLz0vHvTHiWi7PxDvBOypAmLjySJk2Ck96e3B8ReRaOkml7?= =?us-ascii?Q?OkBtK2UlAP6TKpdg76MfLFp1oQ5p23YJWSmsDD7ROjHVEsSmVzg4OzqGRrib?= =?us-ascii?Q?YA8p1FI6rFp+fGaOkAVRAO/YU9wD6tAgWd0b?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?BOghNugwK217A7ZXHxOegH2sU7SPyf/2DIJ337Bu/WM8pGUWBbUpblXH+v6I?= =?us-ascii?Q?WgubiEM2rQvFsl/F7a+FCgA41p5QRAXR+FaJ+SMQKC+6fo0lA6L0ajxWVjqJ?= =?us-ascii?Q?8BN8+Y43YLdBpteo9/WJcJwssnYG2itWB2tj4ptPgOBTAY4VoLehBmtqZo2X?= =?us-ascii?Q?1X6Tx/tyMARrjiSx2QmWyCkXzOtHYCHi18FZZnmu4Fga4xw+c7J2W89GqnRd?= =?us-ascii?Q?UC3mO6LT+WScfQaF51GrNoBzOUTl3qyFwHKu1hzmqONzaVKEBLLTJWXBDEIy?= =?us-ascii?Q?+1Hq40Yryr3nY7K9CckmdJy2ooCvvEJoARwNf8fisX7stNiQObzfqqLgOewM?= =?us-ascii?Q?gIgrRUJ/NF2n39CG5C5zSlMZ9AhhA8YqwYLTX6ZC1IwO09UbpG7COV0E4wMR?= =?us-ascii?Q?HyZtWBIIZH4e6eAa2n1AkmeksEpSvB9+cEws4haCpdYdKJ3e2SE/HXHbhsWW?= =?us-ascii?Q?nklam7fXz82RON0z6S7mrWfZB4hQgJ7Kg0F6CvKjCquaTmPtZa7VOCxNEdsT?= =?us-ascii?Q?ik5TKspi5Q6IdM0mH2s2EJQfUnjZyfZ3/X1X8u8bj1YKdyBINxS2t3MiUGjr?= =?us-ascii?Q?k7R42aZ6YoqpYBCUKrcgeZHln6mFO8H64UizKjvzyPZ7yq0ivsmZmE4huM56?= =?us-ascii?Q?dGosygacYTslIjOYR31VPYeWrtjKddrei8a9XLbOhhnfDChKmk2piwMxVEjj?= =?us-ascii?Q?bRTJ8HuZigCBjb7dvWivsyKuQWzrkFHWpfuCLT37mtfcYrfTfly5ItjQVl7V?= =?us-ascii?Q?zYg5ww7DWtIxXJ64F5s8dMB1F2kGF3FLkMC2iha1ZJV5n53MkCKUNQp43rDA?= =?us-ascii?Q?ys7rWGBl3q5SRu1abYDdxvsQU9scXNimv39bnUQmZ2STT84GZIPFvuAIcsl/?= =?us-ascii?Q?1eLCluAS576Tfyi526dH2NdCFENoAPSXucYUa2y+RJU95lNGfJY+i4bnZHVz?= =?us-ascii?Q?4F58PRqbptwmAX7MpLXG6Ve53kKPhbWGk0z4yc3OaNuvfeZZhV7Nf0OeXM6n?= =?us-ascii?Q?tc4N6e0sar5fzDSD38vv3a6BamVzqS72qhEFRUIeM8OI3QfR/qT36vfb43PA?= =?us-ascii?Q?QE3gR4UWT+yuNfHSV6H5gjmImpD+teRqI/YIK/vzM0q3VpccIshktXqG6ovR?= =?us-ascii?Q?U1TCagFDbcJ1Lz6K/VhGRQ3VFbgiQjRjVs1jGPxJO2aJAqmgIoXJZXKpUd/R?= =?us-ascii?Q?s1rLb1AsioPKIxi08KmVVtGKO6dm6ju7oT6JChbpihpRFHKl7Pb7CjiLCNFQ?= =?us-ascii?Q?khX92jAQcfbpicCjXF2vjDbqccx3YTnODwpE9c1MDiadHxhns/PfRgmbFtKq?= =?us-ascii?Q?tB5YICpe2YNEGhSLT+wEyYnNW4vqPtUz+jcLmwVFcLkOHpziZUyx+4acflVa?= =?us-ascii?Q?XDM9BYuGjQkYroM9EPaHlr5cAMe8aUgAWS6rlEqZEapAfArJAjAUJv9ueLLy?= =?us-ascii?Q?YMlRQKU6N3NpuSZZXUBgKjDwmyAZYpgAPTB7eAkb2LJ/z4imzgdAVRRu/e7S?= =?us-ascii?Q?dW8rpLW1Vdqh16SVhBX9jFFC1+HuEtMvhhh9t5lFV4V7Ni/Wcaa6s7qMdswg?= =?us-ascii?Q?tlDLnzk8jufVVML4ZA8UWQPAEyxcuKsr/TqwWXB+SHDGyfbtIqx3c59ADkYS?= =?us-ascii?Q?wQ=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: ab69bbb3-9cb2-4fc2-cef5-08de2ffd9746 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:34.5555 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: YunWVI5ovbrBHJx9J3aUyD3tb+8nNePjDVAOdJzhpNEyvY7m9sN4XQDxHFQrLnk8tX+tQtnLWEHgEecBiCjuhNKL2424m4wLwQEvOP84h0s= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Introduce a set of helper functions for accessing the on-board GPIO registers on Moxa PCIe serial devices. These cover: - Initializing all pins as outputs - Setting the direction of individual pins - Setting or clearing an output pin - Bulk set/get operations on OUTPUT and DIRECTION registers These functions do not change any existing behavior yet. They are added as a preparation step for follow-up patches that will make use of the GPIOs to control board-specific signals. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 91 +++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index a0deb464a318..6e727b77c105 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -79,11 +79,18 @@ #define MOXA_PUART_RX_FIFO_MEM 0x100 /* Memory Space to Rx FIFO Data Regis= ter */ #define MOXA_PUART_TX_FIFO_MEM 0x100 /* Memory Space to Tx FIFO Data Regis= ter */ =20 +/* GPIO */ #define MOXA_GPIO_DIRECTION 0x09 #define MOXA_GPIO_OUTPUT 0x0A =20 #define MOXA_GPIO_PIN2 BIT(2) =20 +#define MOXA_GPIO_STATE_INPUT 0 +#define MOXA_GPIO_STATE_OUTPUT 1 + +#define MOXA_GPIO_LOW 0 +#define MOXA_GPIO_HIGH 1 + #define MOXA_UIR_OFFSET 0x04 #define MOXA_UIR_RS232 0x00 #define MOXA_UIR_RS422 0x01 @@ -120,6 +127,90 @@ static const struct serial_rs485 mxpcie8250_rs485_supp= orted =3D { .flags =3D SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RX_DURIN= G_TX | SER_RS485_MODE_RS422, }; =20 +/** + * mxpcie8250_gpio_init() - GPIO initialization routine + * @iobar_addr: The base address of the GPIO I/O region + * + * Initializes the GPIO direction. After calling this function, all GPIO + * pins will be set to output. + */ +static void mxpcie8250_gpio_init(resource_size_t iobar_addr) +{ + /* Initialize all the GPIO pins into output state */ + outb(0xff, iobar_addr + MOXA_GPIO_DIRECTION); +} + +/** + * mxpcie8250_gpio_set_direction() - Set GPIO pin direction + * @iobar_addr: The base address of the GPIO I/O region + * @pin: The target GPIO pin (MOXA_GPIO_PIN0 to MOXA_GPIO_PIN7) + * @direction: Desired direction (MOXA_GPIO_STATE_INPUT or MOXA_GPIO_STATE= _OUTPUT) + * + * Sets the direction of the specified GPIO pin. This function should be c= alled + * before performing GPIO set or get operations. + */ +static void mxpcie8250_gpio_set_direction(resource_size_t iobar_addr, int = pin, int direction) +{ + u8 cval; + + cval =3D inb(iobar_addr + MOXA_GPIO_DIRECTION); + + if (direction =3D=3D MOXA_GPIO_STATE_INPUT) + cval &=3D ~pin; + else + cval |=3D pin; + + outb(cval, iobar_addr + MOXA_GPIO_DIRECTION); +} + +/** + * mxpcie8250_gpio_set() - Set GPIO output state + * @iobar_addr: The base address of the GPIO I/O region + * @pin: The target GPIO pin (MOXA_GPIO_PIN0 to MOXA_GPIO_PIN7) + * @state: Desired output state (MOXA_GPIO_HIGH or MOXA_GPIO_LOW) + * + * Sets the output state of the specified GPIO pin. + */ +static void mxpcie8250_gpio_set(resource_size_t iobar_addr, int pin, int s= tate) +{ + u8 cval; + + cval =3D inb(iobar_addr + MOXA_GPIO_OUTPUT); + + if (state =3D=3D MOXA_GPIO_HIGH) + cval |=3D pin; + else + cval &=3D ~pin; + + outb(cval, iobar_addr + MOXA_GPIO_OUTPUT); +} + +/** + * mxpcie8250_gpio_set_all() - Set all GPIO output/direction pins at once + * @iobar_addr: The base address of the GPIO I/O region + * @data: The data to set for all pins + * @offset: Offset of the GPIO register (MOXA_GPIO_OUTPUT or MOXA_GPIO_DIR= ECTION) + * + * Sets the output state or direction of all GPIO pins at once. + */ +static void mxpcie8250_gpio_set_all(resource_size_t iobar_addr, u8 data, u= 8 offset) +{ + outb(data, iobar_addr + offset); +} + +/** + * mxpcie8250_gpio_get_all() - Get all GPIO input/output pins state at once + * @iobar_addr: The base address of the GPIO I/O region + * @data: The buffer to store the states of all pins + * @offset: Offset of the GPIO register (MOXA_GPIO_INPUT or MOXA_GPIO_OUTP= UT) + * + * Gets the input or output state of all GPIO pins at once. + */ +static void mxpcie8250_gpio_get_all(resource_size_t iobar_addr, u8 *data, = u8 offset) +{ + *data =3D inb(iobar_addr + offset); +} + static bool mxpcie8250_is_mini_pcie(unsigned short device) { if (device =3D=3D PCI_DEVICE_ID_MOXA_CP102N || --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022105.outbound.protection.outlook.com [40.107.75.105]) (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 B46F0296BCB; Sun, 30 Nov 2025 10:45:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499547; cv=fail; b=VgzF6FFWv1PmIruPjjKZyyXUjb0IiXP7qYk+t94iDeNTnQOBndYEb5eS5kxbVo5Wc6+jXKJ671B/0WnfjIGEt7SZr8Ouh1pAGmbG4+tdM72AbLgrcO6YDary4uR7XTyk7QF3czoGFHjIH/6iSTdVuUsY8pWB2qxC+9ZzVwplO2U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499547; c=relaxed/simple; bh=uoVU3ZqkEMzoGQBu/ZUXW8ron7Z+J+OPugdaJSlyhbg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=bJGZ8ifL7rd//Ds+GQMBd3gxWTIXj4aR5Ry3yNRh/aSwSiWMQcb5NQm1us2YLwTOpmbq0MOBWVQVzubQgMr3bhbKQX73xQQmSW24aN5L57Zp+G4vQzw9x4uRzY7rqt8mtjD/ml6BnZclrjn76EStVTZKJwgtnckZoyGCYmePOsA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=Rjyb/xtp; arc=fail smtp.client-ip=40.107.75.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="Rjyb/xtp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=feq6HAVnObMx6hX9bPRYVwB9PLLV3B6vJD1EAzN2Li4VME/v8vV+LLnUpMMHasA9xvKL5eJhfE+QchJRHbx3CO/aB2ju1i9PfcO/+TUaMa1qZhvB9x8wrus96NNxT5fEVk4G0J9NCsUeKCvREYtF68m2Obu9QNpgDMe5ciw3FOr8Phh2hHeA7YiisNIuPfZe6txDkop+rxL1Ku5wfdpDFIoxiSCrh7izt9XWPB4MW3bVgg8Ik1Vtg/PBIPxsgjK7ye9QDVkcDS0dht5DaqgzLG4oYx5q722NMfgQNjMl5kp5yUItWSLY9y90gHMdXXyZTBD3CRYnWIYk2TcTsyBEqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LH48BysqmETv9eAODvLxmaAkJKrSxKEWeGlFDvAEHj0=; b=DssCqfDj2asdQ4uDUkRBN6WGcluBx9DcVLLa1/vWdEgNW+5cN1qTfFHGn+DTfGoYrqL8ha4Iajzj8FFhzMKsdHumRwgsGnG7h/bRiVRnwV5UrOL6AuXAdfBvTR4o9daM5N7kD0aI/Pd9aHiK4UYyJCofKNuF0WCi9oqPsykkBdiTKXGvFvSmm1R2an1iuBcELHd/IxwNNUNc0yJtltQS24PjWFgER+k73aYkcIBhCiJM13lGdjEHkXQXqfrcMkAMjOQfy1dSW6zAU3hXdUzEpDhDJXpfKXv3AcsCBg7s9Jqz07711nqcQsbgAT4fAwQu4tU7FIiiAS+ls19gdFTJpw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LH48BysqmETv9eAODvLxmaAkJKrSxKEWeGlFDvAEHj0=; b=Rjyb/xtp6jpQk/79jC0moc8NPY6PU9cZMqZkLY0iLGisO88BHFnX2gRPOqo0m0FtDr9o56qKxaQNEJOWwEDnStRjkz/pdJaqBBH3ZKmLMFcCij5VKyi6HGl6fhgyu7xfCRXTlpc5+OuQokqoORUQGRFw6YqggXSzgIp5W7EYHvM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:39 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:39 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 26/31] serial: 8250_mxpcie: add basic CPLD helper functions Date: Sun, 30 Nov 2025 18:42:17 +0800 Message-ID: <20251130104222.63077-27-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 24abab7f-30aa-47dd-b9a0-08de2ffd9a26 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?STi0LJpC0862CQI4tXSAiAAtudfmVdqyTpPBae++2vRfYg686pMW5BIvuSGm?= =?us-ascii?Q?UN8FFrHdNsCdBRx3woWs4DAi+lSc404Ovo7oTGuxJ+ucOzaNoje1YpIn5lWe?= =?us-ascii?Q?YLDkGYKJO6hFMraJBOTJbS7852RjFWYmtNlni5EOS8kNQ8wQwDWuka3q5FPx?= =?us-ascii?Q?rDDFkM8BISvdn4NXPhAXFJM0s8/Vq87FosANrxQ8a1FJxVdxFG7YGik+loZE?= =?us-ascii?Q?z1+ogWUeNf67Ui3qGRDsXXZlDwaEuGHDv3vNw02yatySTZeLcN08MuaoKV7C?= =?us-ascii?Q?TwHJCYCdwjk1SRy1rZRXyCj56PNY1kOSwTy65DQpmdN/GtO1ajBPWdPCKofT?= =?us-ascii?Q?gy6A24E4On8gEIZIxRvHx6d5arvu4Hb81GDqDrcFxCOXKus5uEn56UFz1sgC?= =?us-ascii?Q?+BFlE9ji62A16Iwtc9T3NdhEWWL1xn9Ygno8YU8zc5XzI5tK/zABrGLBe6Wq?= =?us-ascii?Q?n0lRDXL9nBxnTe+d5l+giiDU07X33WKhCJxYvWOBJo6xxMFBBbopzom+5xnb?= =?us-ascii?Q?XqEP+rX/hy9ElG4Kux3evXdruHIlGa5BCZo9lO5q/wLBWejWeJltggrT72iT?= =?us-ascii?Q?/aOpGxxzctyRs1t48+1CpcrsXQHF3js6ILRWsjcjzclFCwom0SojcLcd0YKm?= =?us-ascii?Q?8bTn+25Hi/ENLzDUSiINFj9Wo1YODZldDWgLl5EIY9Zb9BzvlJ3Px2b0Shso?= =?us-ascii?Q?676o9lPME/6BUMfYuN5fmsDZE2ZIJHOt+Aj7Pnpwt2ohmvQm0HEsHJJQgl/6?= =?us-ascii?Q?6UOh34uzaU+riuXrKxbY5m6/rKQkASj4A4bJIhFhGB+z5E0iF9PsB+Cog0YV?= =?us-ascii?Q?j3G7aTBZIRsS6EEEWnH9rUetuMWVWWKsi6LUMscs4G+kgCqJ3YEKsnMND9J3?= =?us-ascii?Q?3ANrYOqCpGGxvppXc8VKyUU/EXIjdF/NvPZsGHHs9RMSm0SyzzOUrfc3c4ZG?= =?us-ascii?Q?8yxzD8UL2/j+4MgRCk4wB81p8ypVzA+syZRvDaS/1PvX+XNlvwBzfmEu7ejP?= =?us-ascii?Q?d8O2ZW/kc+qWY/RBmFPQrRjbDTcZiE1e1AdUjZnU3QbixWCUxcBpFRFW83ld?= =?us-ascii?Q?Kxw2wPrcHjXc5cVcJHZp/N1stB/Ic1xsDE5scyo6G7DeU3YXDupa/q93jtRF?= =?us-ascii?Q?MXAQeF3am7AKhh7NYw0FAqT+T/Ao9LlIRsM1xE+XkEDXIPBBJdHXpmT0N/70?= =?us-ascii?Q?RqN+40VSaG88r4aNL4WsLZj5FFYR1QQ/t+sAWSS9+myNhTpfCAZ2L/i/qKVM?= =?us-ascii?Q?uVeAQ5sMmL6OldOsiKTMwzdoUkASx63a3T25hMHQrZrDPei5/vM6N9wKxCFk?= =?us-ascii?Q?VzmandIshsV8szxTguRsZ4jlEH2ocbGyGa5W0qVvsedQHit7V3ppKz6clHQF?= =?us-ascii?Q?lyS6XUz0fh/WNFfTyX69/uInopF2yTos7r0AUdKhWXFVecqugFLZ9ympt85j?= =?us-ascii?Q?Fi0MFakma+ky5zMJWLAJA+JLDkcDXyHIcqwmbvdHFBxrDmH3j2lpLh+3B7Cq?= =?us-ascii?Q?SucO1uMyzABmuXxhcuWgou7Nt+VV0PxezarB?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KMHeSBI3iOUtyMJRBWAg/D8YNdt4Z7EfdM6eWkKS3/IuLnd3ZbIzJPtLDdlq?= =?us-ascii?Q?WWGqFpgLfZVABCtgw2B2MlwV26tZ/fu9NtSGGx2HdF399JJBp29Ed50KsjEd?= =?us-ascii?Q?oFmcru2+DR7wflDiDkh7Ta02gmN/xYa+TWD0wluMPE2bCddHmZ+cE/lrYGIk?= =?us-ascii?Q?hfAG5ju1Ev9s4rtjXFOzy+KAa8iy92Bez6XVNf/Ksncj+4qpMYagh5d/WTss?= =?us-ascii?Q?gAtr9/b+gRl2l4xLSTvekHEaaTYhYHszx0yO4CPq11Hc3YO2iSCVs1xwx5J4?= =?us-ascii?Q?kV9JWbTaGHxd3YUtJCeA/P/wxReDpkZaKaAlzQBc0Z3K+N0K9Ihyrn5W8H9g?= =?us-ascii?Q?R73jOIgMrqWsk+G7czOjncOAgPJlxlcJtjN3v1zwMzkX4D4Q1PzX+Rc63eZ9?= =?us-ascii?Q?nuoM1IgTYydJFOxncip3KKbFJ65UQgxdT3oEkCg2gYev7Kiioyvs/vpnXf/i?= =?us-ascii?Q?T6qdmHQLRoa7Pv27XAp2AuR7A3J/8WDKvu4qYbO0Tt3g3F5kwfhYKP8LqLdf?= =?us-ascii?Q?gQeMEuk3QeF7VY3WN/3yEKO8UUEd3ikAC1lEtfWtTOey/7vqcwJztHKcSRQT?= =?us-ascii?Q?Lq57LcsfyRtvkSid2osUQJxPpCGa+A1Ozf8aaHfQVsyY3UOc1iPa0MNNQchI?= =?us-ascii?Q?r7khnmWRqdRuuMct83hf5n+/H5fy/GFCa0tbITlkA8u3j1wRJGGqyNdCyMMI?= =?us-ascii?Q?Mq6XTYDbw9M7xKr1NAo3NrwvzcNxx6tdVe2ZYjGtTZ199EBLy9dRI48LVMp4?= =?us-ascii?Q?VN8Yt+utwAhV2VeD/ttIJzLI+ozBSttKg7ZNdJcq1wmnOF/ouIgHi74N/MgJ?= =?us-ascii?Q?Rsnjse7SMdwVrRlLrHO9cc/SMyk/PeKK2I8Aq9gv6GmtNNnG7ybO51yEFFOo?= =?us-ascii?Q?MrtGDcgdyuYhFhSi0STL1iSQsBk0sRMJe1lZqhqh+PfkrfdkNr3zhsjWhj7z?= =?us-ascii?Q?Pd3bFIbmmknXon5h5UAyrzHD55Z/cM7bDZQ5LVGgIm5PmYGdBaNkEhx54T3s?= =?us-ascii?Q?78UM/PoWy7S3Qo9lA3tS66MVkLy6QcvI14gqYHGFkPPbjCQ2Cu1ip1KkT/E/?= =?us-ascii?Q?/qzqAUgLiAApldBlXLzOT0rA4jirpb7QwOy2uCj5WV4q1l6YNHvmZ9KDCAzg?= =?us-ascii?Q?JBGfmYIqn4ejAZYLnwgOaI/PblbmU5F5VakX176b/UzIwHseyMjdKZq9prBz?= =?us-ascii?Q?x1X1Csv+rr9ymDN95p73MGOFDveJ12DBVc0tpubiiCJhh9EHqQrawkpZmonI?= =?us-ascii?Q?7UZs1zABol2l2kC0NQF41SicL5emhGW015pvXcZt6TJCZWK5bJQ0qqKFZiRC?= =?us-ascii?Q?iPStsQjzq4RkPEjVN16NMpMiPRMrmb9SHzad8H6T+rTX431AMafyDJZEFEIQ?= =?us-ascii?Q?9pMsUWQxX2UgZB3AcckeYsn/+ij58s7easazBwZAlr4klPcBJdq9xilO62rs?= =?us-ascii?Q?l8H3dmINZogQ6ZhzNJC9vg7OgRTjbZANy7QVwgoqiqcnH5mDCC3iIumKkYPs?= =?us-ascii?Q?y6bVOuGYY+2TwN7eJg3W7YkGIShPD6qgCubLy9zWx0M5E6drVNNuodPp1qRh?= =?us-ascii?Q?CTgWBc/OAy0IFVYvL3VP57p2hRqw8MAZqb8CRWJ/x86/OKwyMmSlpcvoc65K?= =?us-ascii?Q?3w=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 24abab7f-30aa-47dd-b9a0-08de2ffd9a26 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:39.4267 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: cae/4Vs3xt5GP/J9sxpxuJBZNJcnbEezEjWva+X+OWSXn/mXFm5g1zXKlg9VT2qXvBsLQoOsr+foxQtKWxy0CM51nOU9qcYtYRzeL19WN7A= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Introduce a set of helper functions to access the on-board CPLD on Moxa PCIe serial devices through the GPIO I/O space. These helpers cover: - Initializing the CPLD-related GPIO pins to a safe default state - Enabling/disabling the CPLD chip select - Switching between read/write and address/data modes - Performing single-byte read and write transactions using GPIO bit-banging, with simple delay and retry logic These functions do not affect the UART datapath and are not yet used by the driver. They are added as a preparation step for follow-up patches that will implement more complex CPLD-based features. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 240 ++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 6e727b77c105..88ab918fd000 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -6,6 +6,7 @@ * Author: Crescent Hsieh */ =20 +#include #include #include #include @@ -80,10 +81,18 @@ #define MOXA_PUART_TX_FIFO_MEM 0x100 /* Memory Space to Tx FIFO Data Regis= ter */ =20 /* GPIO */ +#define MOXA_GPIO_INPUT 0x08 #define MOXA_GPIO_DIRECTION 0x09 #define MOXA_GPIO_OUTPUT 0x0A =20 +#define MOXA_GPIO_PIN0 BIT(0) +#define MOXA_GPIO_PIN1 BIT(1) #define MOXA_GPIO_PIN2 BIT(2) +#define MOXA_GPIO_PIN3 BIT(3) +#define MOXA_GPIO_PIN4 BIT(4) +#define MOXA_GPIO_PIN5 BIT(5) /* Address/Data Pin */ +#define MOXA_GPIO_PIN6 BIT(6) /* Read/Write Pin */ +#define MOXA_GPIO_PIN7 BIT(7) /* Chip Select Pin */ =20 #define MOXA_GPIO_STATE_INPUT 0 #define MOXA_GPIO_STATE_OUTPUT 1 @@ -91,6 +100,21 @@ #define MOXA_GPIO_LOW 0 #define MOXA_GPIO_HIGH 1 =20 +/* CPLD */ +#define MOXA_CPLD_RETRY_CNT 5 + +#define MOXA_CPLD_GET_STATE_BASE 0x10 +#define MOXA_CPLD_SET_STATE_BASE 0x18 + +#define MOXA_CPLD_DATA_MASK 0x1F /* Pin0 ~ Pin4 */ +#define MOXA_CPLD_CTRL_MASK 0xE0 /* Pin5 ~ Pin7 */ + +#define MOXA_CPLD_READ 0 +#define MOXA_CPLD_WRITE 1 + +#define MOXA_CPLD_ADDRESS 0 +#define MOXA_CPLD_DATA 1 + #define MOXA_UIR_OFFSET 0x04 #define MOXA_UIR_RS232 0x00 #define MOXA_UIR_RS422 0x01 @@ -211,6 +235,218 @@ static void mxpcie8250_gpio_get_all(resource_size_t i= obar_addr, u8 *data, u8 off *data =3D inb(iobar_addr + offset); } =20 +/** + * mxpcie8250_cpld_init() - Initialize CPLD control GPIO pins + * @iobar_addr: The base address of the GPIO I/O region + * + * Initialize the GPIO pins used to control the CPLD. Also sets all GPIO p= ins + * to output and drives them HIGH to ensure a safe default state. + */ +static void mxpcie8250_cpld_init(resource_size_t iobar_addr) +{ + mxpcie8250_gpio_init(iobar_addr); + + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN7, MOXA_GPIO_HIGH); + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN6, MOXA_GPIO_HIGH); + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN5, MOXA_GPIO_HIGH); + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN0, MOXA_GPIO_HIGH); + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN1, MOXA_GPIO_HIGH); + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN2, MOXA_GPIO_HIGH); + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN3, MOXA_GPIO_HIGH); + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN4, MOXA_GPIO_HIGH); +} + +/** + * mxpcie8250_cpld_enable() - Enable the CPLD + * @iobar_addr: The base address of the GPIO I/O region + * + * Enables the CPLD by pulling the chip select pin low. + */ +static void mxpcie8250_cpld_enable(resource_size_t iobar_addr) +{ + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN7, MOXA_GPIO_LOW); +} + +/** + * mxpcie8250_cpld_disable() - Disable the CPLD and reset all GPIO pins + * @iobar_addr: The base address of the GPIO I/O region + * + * Disables the CPLD by pulling the chip select pin high. Also resets all = GPIO + * pins to output and drives them HIGH to ensure a safe default state. + */ +static void mxpcie8250_cpld_disable(resource_size_t iobar_addr) +{ + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN7, MOXA_GPIO_HIGH); + + /* Set all GPIO pins to output state and pull them HIGH */ + mxpcie8250_gpio_set_all(iobar_addr, 0xff, MOXA_GPIO_DIRECTION); + mxpcie8250_gpio_set_all(iobar_addr, 0xff, MOXA_GPIO_OUTPUT); +} + +/** + * mxpcie8250_cpld_set_direction() - Set CPLD read/write direction + * @iobar_addr: The base address of the GPIO I/O region + * @direction: Desired CPLD direction (MOXA_CPLD_READ or MOXA_CPLD_WRITE) + * + * Sets the CPLD read/write direction by changing the state of the read/wr= ite + * control pin. + */ +static void mxpcie8250_cpld_set_direction(resource_size_t iobar_addr, int = direction) +{ + if (direction =3D=3D MOXA_CPLD_READ) + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN6, MOXA_GPIO_HIGH); + else + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN6, MOXA_GPIO_LOW); +} + +/** + * mxpcie8250_cpld_set_mode() - Set CPLD address/data mode + * @iobar_addr: The base address of the GPIO I/O region + * @mode: Desired CPLD mode (MOXA_CPLD_ADDRESS or MOXA_CPLD_DATA) + * + * Sets the CPLD addr/data mode by changing the state of the address/data + * control pin. + */ +static void mxpcie8250_cpld_set_mode(resource_size_t iobar_addr, int mode) +{ + if (mode =3D=3D MOXA_CPLD_ADDRESS) + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN5, MOXA_GPIO_LOW); + else + mxpcie8250_gpio_set(iobar_addr, MOXA_GPIO_PIN5, MOXA_GPIO_HIGH); +} + +/** + * mxpcie8250_cpld_read() - Read a byte from the CPLD at a specified addre= ss + * @iobar_addr: The base address of the GPIO I/O region + * @addr: Address in the CPLD to read from + * @data: The buffer to store the read value + * + * Reads a single byte of data from the CPLD at the given address using + * GPIO-based communication. + */ +static void mxpcie8250_cpld_read(resource_size_t iobar_addr, u8 addr, u8 *= data) +{ + u8 saved_state, new_state; + u8 samples[MOXA_CPLD_RETRY_CNT], votes[MOXA_CPLD_RETRY_CNT]; + int i, j; + + /* Perform multiple read attempts with majority voting */ + for (i =3D 0; i < MOXA_CPLD_RETRY_CNT; i++) { + /* Set read/write pin to read state */ + mxpcie8250_cpld_set_direction(iobar_addr, MOXA_CPLD_READ); + /* Set address/data bus pins to output for address phase */ + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN0, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN1, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN2, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN3, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN4, MOXA_GPIO_STAT= E_OUTPUT); + /* Backup current GPIO output state */ + mxpcie8250_gpio_get_all(iobar_addr, &saved_state, MOXA_GPIO_OUTPUT); + /* Prepare address to GPIO bus */ + new_state =3D saved_state & MOXA_CPLD_CTRL_MASK; + new_state |=3D (addr & MOXA_CPLD_DATA_MASK); + /* Output address to GPIO bus */ + mxpcie8250_gpio_set_all(iobar_addr, new_state, MOXA_GPIO_OUTPUT); + /* Switch to address mode (address/data pin) */ + mxpcie8250_cpld_set_mode(iobar_addr, MOXA_CPLD_ADDRESS); + /* Enable CPLD by pulling chip select pin low*/ + mxpcie8250_cpld_enable(iobar_addr); + /* Wait for CPLD timing (about 70 ns) */ + mdelay(1); + /* Switch to data mode (address/data pin) */ + mxpcie8250_cpld_set_mode(iobar_addr, MOXA_CPLD_DATA); + /* Set address/data bus pins to input for data phase */ + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN0, MOXA_GPIO_STAT= E_INPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN1, MOXA_GPIO_STAT= E_INPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN2, MOXA_GPIO_STAT= E_INPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN3, MOXA_GPIO_STAT= E_INPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN4, MOXA_GPIO_STAT= E_INPUT); + /* Wait for CPLD timing (about 70 ns) */ + mdelay(1); + /* Read data bus pins */ + mxpcie8250_gpio_get_all(iobar_addr, data, MOXA_GPIO_INPUT); + *data &=3D MOXA_CPLD_DATA_MASK; + /* No need to restore read/write pin (defaults to read); disable CPLD */ + mxpcie8250_cpld_disable(iobar_addr); + /* Store read value for voting */ + samples[i] =3D *data; + votes[i] =3D 0; + + for (j =3D i - 1; j >=3D 0; j--) { + if (samples[j] =3D=3D samples[i]) + votes[i]++; + } + /* Perform majority voting to select stable value */ + if (votes[i] >=3D (MOXA_CPLD_RETRY_CNT / 2)) + break; + } +} + +/** + * mxpcie8250_cpld_write() - Write a byte to the CPLD at a specified addre= ss + * @iobar_addr: The base address of the GPIO I/O region + * @addr: Address in the CPLD to write to + * @data: Data byte to write + * + * Writes a single byte of data to the CPLD at the given address using + * GPIO-based communication. Includes verification with optional retry. + */ +static void mxpcie8250_cpld_write(resource_size_t iobar_addr, u8 addr, u8 = data) +{ + u8 saved_state, new_state, verify_data; + int retry_cnt; + + for (retry_cnt =3D 0; retry_cnt < MOXA_CPLD_RETRY_CNT; retry_cnt++) { + /* Set read/write pin to write state */ + mxpcie8250_cpld_set_direction(iobar_addr, MOXA_CPLD_WRITE); + /* Set data bus pins to output for address phase */ + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN0, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN1, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN2, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN3, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN4, MOXA_GPIO_STAT= E_OUTPUT); + /* Backup current GPIO output state */ + mxpcie8250_gpio_get_all(iobar_addr, &saved_state, MOXA_GPIO_OUTPUT); + /* Prepare bus value with address bits */ + new_state =3D saved_state & MOXA_CPLD_CTRL_MASK; + new_state |=3D (addr & MOXA_CPLD_DATA_MASK); + /* Output address to GPIO bus */ + mxpcie8250_gpio_set_all(iobar_addr, new_state, MOXA_GPIO_OUTPUT); + /* Switch to address mode (address/data pin)*/ + mxpcie8250_cpld_set_mode(iobar_addr, MOXA_CPLD_ADDRESS); + /* Enable CPLD by pulling chip select pin low */ + mxpcie8250_cpld_enable(iobar_addr); + /* Wait for CPLD timing (about 70 ns) */ + mdelay(1); + /* Set data bus pins to output for data phase */ + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN0, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN1, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN2, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN3, MOXA_GPIO_STAT= E_OUTPUT); + mxpcie8250_gpio_set_direction(iobar_addr, MOXA_GPIO_PIN4, MOXA_GPIO_STAT= E_OUTPUT); + /* Switch to data mode (address/data pin) */ + mxpcie8250_cpld_set_mode(iobar_addr, MOXA_CPLD_DATA); + /* Backup current GPIO output state */ + mxpcie8250_gpio_get_all(iobar_addr, &saved_state, MOXA_GPIO_OUTPUT); + /* Prepare bus value with data bits */ + new_state =3D saved_state & MOXA_CPLD_CTRL_MASK; + new_state |=3D (data & MOXA_CPLD_DATA_MASK); + /* Output data to GPIO bus */ + mxpcie8250_gpio_set_all(iobar_addr, new_state, MOXA_GPIO_OUTPUT); + /* Wait for CPLD timing (about 70 ns) */ + mdelay(1); + /* Disable CPLD by releasing chip select pin */ + mxpcie8250_cpld_disable(iobar_addr); + + if (addr & MOXA_CPLD_SET_STATE_BASE) { + mxpcie8250_cpld_read(iobar_addr, ((addr & ~MOXA_CPLD_SET_STATE_BASE) | = MOXA_CPLD_GET_STATE_BASE), &verify_data); + + if (verify_data =3D=3D data) + break; + } + } +} + static bool mxpcie8250_is_mini_pcie(unsigned short device) { if (device =3D=3D PCI_DEVICE_ID_MOXA_CP102N || @@ -585,6 +821,10 @@ static int mxpcie8250_init(struct pci_dev *pdev) resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); u8 cval; =20 + mxpcie8250_cpld_init(iobar_addr); + + outb(0x0f, iobar_addr + MOXA_GPIO_DIRECTION); + /* Initial terminator */ if (pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP114EL || pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP118EL_A) { --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022105.outbound.protection.outlook.com [40.107.75.105]) (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 1B1B029898B; Sun, 30 Nov 2025 10:45:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499549; cv=fail; b=dCl5pRGbMN3oIWnmiHx1T/bfoRN2hAbQI4cuOrkpxQYraK2lWENFiLek6wMb0yv8YeVtU+46yrB7ZrhufRs0aODFVqIQhG9Ko9FK485WB9xrdMV/Dpv+szQYCFwrNw5u3+8SbMn5meqgNnBVMsc4ZNPgnk24CAJiCqLSqfnonq8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499549; c=relaxed/simple; bh=dZg7V0I30uItKcsOCEE/0xzggIPhrk8tidzFoTfGZVY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=S1IGFO3JokwOuPNG4gza3B9GLh08tCs/CTmvfLsaJPiNO3drdRVLQzLp/4xIloqQpWesPe6h5KCbjtybDcxibB5cE8OhTyu1l2hZ2KzVxLEp0uUAeWgqvOBaoppX94CZSqlMasXRS4iQgqQ+bvVlxM/Mf704XBJnxsaIwlyGaWY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=GmXhsJIo; arc=fail smtp.client-ip=40.107.75.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="GmXhsJIo" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nG/JnN4SBLF8BU/dgz5PDzUPSGBxiR9/xygXdC3jM22ulyasmS1eCIRnkgp3PR6R4lG/Z5IlbHSJk+kH2s6n7/B5LkLXyNCjbhyd7HrdtMokcQ1L7Bj6imAKyrWYMCQR5QZyLWcr+EbWhfBkdKSZaY2fVYzsERnUXFKq0yDQxCbQLG7MktW2qHQ7Xndw1wYYKVqhnrBSUDLkvc1e/lnm6StJpdql9mnqRPa1+Tdan/eZSeFsA+sdn33qmu8A8MhK6X4ehmpqpGOR3w51cMGp7kfb2BeX9seol312JttucMi4OcN83sLaTst/oid/FJD5oIgVRfSr7Bm00RekgpxzgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wzFM3sTFAzk2a+qtG7tUjnAUDWU3n0ZCFKK/yN7Tgnw=; b=dr65IPReEWOTggXYK57nNU9D0Fcm2r5y/92vwUqd0J8D8rKQNbwZKbWDnL6szUUIhpRt0JJmRiNkrRE0fXuar8EXiCuzx9XRnW8z2J1K9M393y7UYh2cv4apBJW6PKaJ9moNrhCU+tzoQgotjxb67E3DScey3UrQFeOw+LCqmmVDi0XM2M64llClKt9jEN8kwM926brKLSyDqqEsAHc1aI7Da/I3iiDAyJezExm3VtzRbVtDV+hUKAKxxVWtjEsmpSw0jK8afmUm4R4y2hFCVP4fAyJNblaqBozum7axyVGNu8PjRV8rMx1GBYzs6sjV6J10mZ53kyl2fqn1SCVqAQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wzFM3sTFAzk2a+qtG7tUjnAUDWU3n0ZCFKK/yN7Tgnw=; b=GmXhsJIoOVHFRUJtR8hjFPzxmMsIFrXbsZ/7i035ReQQJEcAfg8KBdisNhe/ibtQ7va0yVitRYN0mm4qQhtnvKBFAF+XjoFgveTn6JihSzqUA0RFYWLjsyow9SYFpawFZh3dy6P6Y6h+3ZodwvX8KhlQMYFDXf6HDNLrvA0nIk0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:44 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:44 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 27/31] serial: 8250: Allow dynamic extension of uart_port attr_group Date: Sun, 30 Nov 2025 18:42:18 +0800 Message-ID: <20251130104222.63077-28-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 856075cd-283b-4d4c-e195-08de2ffd9d3e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?dcst/DKXWlxqxF32xGX4sKnjYA91d/gD0iARsRy2rXemihwh5A9AVoRozZ3e?= =?us-ascii?Q?8uAiv20gVdh089ERZMc1oI/FxGllV983OKEpLDn1XQSVZG3WVYHRNYlS79X7?= =?us-ascii?Q?glM9XudwBD0Ctc9t2vCKkjIxZAcVd1TcomNuEoyoJclj8gHooxNj4gqdkYTf?= =?us-ascii?Q?9Kq5PapNT3HFBGnQTajc98XXFRS05whfoZU+Vk32hcMEpH8qVI/ELHEbRAqs?= =?us-ascii?Q?uHAUAzeybJeqdp3BzCGPpnMBz/gqiOA8kGNGY496Dx5MzYaUKrWWcGd9c9jg?= =?us-ascii?Q?1n17a/KHt+lSeprH6YgITy9W/+vlEmPxipw+15T1Nb5ykWG2XaDQB3H3EzoX?= =?us-ascii?Q?0qjFfEIRwJHEw6RdUCt7dt87Qh87VMVOeZ5yEvtC5ztjJZranPr++lHrrHuF?= =?us-ascii?Q?jDNlJua6gxY8uxdtzReobVm7yfyi+5fgifpmd8txchg8a96NLqf+dBjZSWAE?= =?us-ascii?Q?IzU7vnsRqfSKua7ZHMdiOG1RXNTBqsoAqBvVFTmjIaI4AXYERoMlHrLGQaw/?= =?us-ascii?Q?q7dYpFtW1xaAt3roSYjU2zYV1CLvf/UbzBAC2q+W+VDb4pGmFj81+lrty2UR?= =?us-ascii?Q?iL6q/g6TJXEQ2jszDT8EwReR74FxrqTiknz/E/F2GFm8RsXrDWy5JCupmh0c?= =?us-ascii?Q?ECeMqSTwa/ZAVAT/C0k7F8ioZ/ByYzL+BFX9gbihhOIuQp4HTLezpkSjLIVv?= =?us-ascii?Q?mNUoXqAovqqipL/s3IF2f8yfoNR9dx30wHRbWM9AvLAZTKhbnvuwbl4z+Foi?= =?us-ascii?Q?sQfZLHgEhhvEOQGEi0d+7PpZuO0EgrAEqSJrHJSfckiO2j59F89tBSJCFSOg?= =?us-ascii?Q?44a8ce2trysdmNBZHqi33YqojkqtlyDHbyJcFqXTR4mvgZxQbGANOF2t/yPc?= =?us-ascii?Q?LXp8TocOvFDaE4e+BDd28nSSMgPg0OxG5jLPHzWMZyVDmvt9pGNspPnCIF3C?= =?us-ascii?Q?wu6JudsP4jKLlw/qEeYfCBSdKVFN/NFTkzcMTQbOUt9BiN+FzOtQK8q0hFL9?= =?us-ascii?Q?GBkf2PYuUeMSTUlU6S0MhrKmwzQMdzfNCdMvcW4SQlRLE+utjud5K3c5nzz0?= =?us-ascii?Q?dUdUhF9aNNHhOtPgPFAqLepOW67EUJYxlchrkJC9AHg3xywytQgjbKYrn8u7?= =?us-ascii?Q?OzOe2spcxStdKiidmfkaGFqYIOUtguVpTQYgeuDrPP9PGic/LykDDfW2vOMc?= =?us-ascii?Q?iByUGIuzsHKB7qNZgKHANG1z67DKLCail66kCt8FnUr/W7DaSRIVKL/pXP6k?= =?us-ascii?Q?a3rl++w3IGNXeYXoFdcJfa7simNtlcqN7fauOKGRNUXW49mlKk/rFtK6mi67?= =?us-ascii?Q?2vQQMS9Xxss7dkr1teO3tPG0PJW0vi05EJl1EYEegYPVVFlR8JNOl6Hi0WqR?= =?us-ascii?Q?xacB3MQT+FxnTU6Ik1ivhgSSP00TT2o1V6/35bi3VbZBgW67RzRbcXkfgQfz?= =?us-ascii?Q?6tfcEQNI3xyIuy/wPNSBY9Tc+ujcoYh7G2h8d3Dya4x2gMTbVe7T3lmKkfuV?= =?us-ascii?Q?H6WLKNcmNtT1jKNZruRmwFzn7tbAk6tzE/wx?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Xeco2hvD80sVvolPtBbR2pxc6244iDpAEkSKDVb3giPiMvyg4SJr2djSH63R?= =?us-ascii?Q?t8fOY/wZpVAl4gA4fH87IbfFZaoLadS3vdXLko+aj/rR8Us3/yy26FlGHL08?= =?us-ascii?Q?og0Cv98eGGfvvWLgmuS7Za9e0N9zNjSxLgSb+kZXCroVftSs55ucfibXLqur?= =?us-ascii?Q?iLP6Vxo2tvQbcExKXMm5uvSQyCH8Qp3Jj8Mqjo9tN7EKFEZMnmEA6uVz5JhH?= =?us-ascii?Q?X7bnbNkAv9y1WFlTug5OpYf3nlF9rB7WHtB8B4gH3oD10nd7tLnhz+4gcAw/?= =?us-ascii?Q?s2D40hJW3ixCAdt0wmkxOTTLbhKGfnS0oeFo9o6B2sQB6wJwjsLyJOoOhHkx?= =?us-ascii?Q?Kus+6+nQ3pfWVSwF62ykLgUbOqUn6+YFamS1bQ9XhsyuIXCmfdBDtRQ4pjBj?= =?us-ascii?Q?By4PCN5PPd/XOplnGNfcCIV5klJqZ5HEt7iSdsexvhkuUjqIVO5xH8yzExU/?= =?us-ascii?Q?Y/t6T6PiVRM0f4zR7ZpA5206W7QRtm/vKXt/+umDM2/+cDMyMnP5fXK3qkCL?= =?us-ascii?Q?+fh3snuQlF88wdlCoBh1s/YHNjoN6jmMSbTHZwUZIZ6cmhcabmzZMT1JHCVp?= =?us-ascii?Q?wyeO6OV7lYx1qjrKSM3p5sj5huHng1KcnBwyQ1XaWr6ggXJaiRzkHdSqb7e4?= =?us-ascii?Q?5OzQfx5XUqyD4ZvTym/Y16KYUTdyMYP27jDRVQTIuPPS4ex9lZnwSDGe59dg?= =?us-ascii?Q?VD1o0DmvnOiJNFjJK71eIv+BpdGtMnI2daT6w5yNjpgVH1WmScFRodN+idKL?= =?us-ascii?Q?eaaMFq3PPHC/bIb3/xfLambCJiaNtM0OolfG9DMBSrO2qZujwe78jpmVJ3R5?= =?us-ascii?Q?CtPaoGiQgeS3dek1t9oU00gUE2yHNzvxAxeGipwfzk3N1Ym22vJf2kLUuw7B?= =?us-ascii?Q?zEM6u0F4uASLsOPOaZS9fHVWW9EGpMeMpJqabZGttGPP5dnot5eerFHr6RbI?= =?us-ascii?Q?1hsVOTD5XtNuY2OBIjAuW/YJiwgdbY2jZQs/XsmrGKmsaiX6VP/LaV0M1O9X?= =?us-ascii?Q?fdib4Lr2lTEynXgaSNkXK7mDxCiMaOU1iBP+KBQ8ZJL6fgtsJuFxVy7HARSR?= =?us-ascii?Q?bCsw3UjoUj8s9A1fqulu20ka/j7edbGgDHjC0HsD+MBL7ZOwVXDHzhAM0TeC?= =?us-ascii?Q?acUUGhpFVPscA4ffUezfR3Xjltrgng7lB+UMZDHjQHjeOB3b3/S/EE14YFby?= =?us-ascii?Q?VBeTQz7GHizdws6MueQzoc2SXfRL2uUU0AnsvgId7Q42dJ1lQQuVfizJfgJ7?= =?us-ascii?Q?tYwg9fZ4Oxag4F7VzYDn1Lo87ZQHXe5L0EpCR0pZxd1GYPKXyVIk3bRvs5Yf?= =?us-ascii?Q?0seuyaJ158h4GtJFYnT2/jZP63pwRE6i3+iWP5FsWM+1QJ0lUWfpoZg+erwu?= =?us-ascii?Q?AfbHqcwb9JouVMwve4eoYamyCsBOB8mLXdgRTtwJgDtOLcURti3fM/V3FBZU?= =?us-ascii?Q?v8NP5mikN87djIhSe9Yg0UszngqBZZEFUuJp75i0xm5gn5RXLNI8beDc+kzr?= =?us-ascii?Q?OeYXoXZEBgVBDujU5cH4+DJ37xz+KH53Xi13I+IVGcm1kwHuUJXiFvXgOYmL?= =?us-ascii?Q?drXgfP58KYcaU5vk03Y03YdqL6xxPanS/HmZfX+2ICYFety2nT5y6OEkdSUq?= =?us-ascii?Q?rA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 856075cd-283b-4d4c-e195-08de2ffd9d3e X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:44.5513 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: GZ2ADuDgjfNIszl4ce2rg20B+lku9dbIisfPJkIa4XTk4jUg2fGc8nl1sdd16oMuZAJvX1L7YYeps7IxN5LrH3WkQRtvaWqtJeljCrdR7Fo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Currently, uart_port->attr_group can only reference a statically defined attribute_group, which prevents drivers from appending their own sysfs attributes. This enables drivers to inject custom sysfs entries without overriding the core-provided rxtrig interface. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_core.c | 8 ++++++++ drivers/tty/serial/8250/8250_port.c | 26 ++++++++++++++++++++++++-- include/linux/serial_core.h | 1 + 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/= 8250_core.c index 3d8575874759..66b942e9e78a 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -812,6 +812,8 @@ int serial8250_register_8250_port(const struct uart_825= 0_port *up) uart->port.set_rxtrig =3D up->port.set_rxtrig; if (up->port.get_rxtrig) uart->port.get_rxtrig =3D up->port.get_rxtrig; + if (up->port.attr_group) + uart->port.attr_group =3D up->port.attr_group; if (up->dl_read) uart->dl_read =3D up->dl_read; if (up->dl_write) @@ -895,6 +897,12 @@ void serial8250_unregister_port(int line) uart->port.type =3D PORT_UNKNOWN; uart->port.dev =3D &serial8250_isa_devs->dev; uart->port.port_id =3D line; + + if (uart->port.attr_group_allocated) { + kfree(uart->port.attr_group->attrs); + kfree(uart->port.attr_group); + } + uart->port.attr_group =3D NULL; uart->capabilities =3D 0; serial8250_init_port(uart); serial8250_apply_quirks(uart); diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index d7baceacd4ff..e84879718a51 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -3192,9 +3192,31 @@ static struct attribute_group serial8250_dev_attr_gr= oup =3D { static void register_dev_spec_attr_grp(struct uart_8250_port *up) { const struct serial8250_config *conf_type =3D &uart_config[up->port.type]; + struct attribute **upp_attrs =3D NULL; + int upp_attr_num =3D 0, i; =20 - if (conf_type->rxtrig_bytes[0]) - up->port.attr_group =3D &serial8250_dev_attr_group; + up->port.attr_group_allocated =3D false; + + if (up->port.attr_group) { + upp_attrs =3D up->port.attr_group->attrs; + + while (upp_attrs[upp_attr_num]) + upp_attr_num++; + + up->port.attr_group =3D kcalloc(1, sizeof(struct attribute_group), GFP_K= ERNEL); + up->port.attr_group->attrs =3D kcalloc(upp_attr_num + 2, sizeof(struct a= ttribute *), GFP_KERNEL); + + for (i =3D 0; i < upp_attr_num; ++i) + up->port.attr_group->attrs[i] =3D upp_attrs[i]; + + if (conf_type->rxtrig_bytes[0]) + up->port.attr_group->attrs[upp_attr_num] =3D &dev_attr_rx_trig_bytes.at= tr; + + up->port.attr_group_allocated =3D true; + } else { + if (conf_type->rxtrig_bytes[0]) + up->port.attr_group =3D &serial8250_dev_attr_group; + } } =20 static void serial8250_config_port(struct uart_port *port, int flags) diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 96646d3f2943..95ef7b08b6d8 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -590,6 +590,7 @@ struct uart_port { unsigned char console_reinit; const char *name; /* port name */ struct attribute_group *attr_group; /* port specific attributes */ + bool attr_group_allocated; /* whether attr_group is dynamic allocated */ const struct attribute_group **tty_groups; /* all attributes (serial core= use only) */ struct serial_rs485 rs485; struct serial_rs485 rs485_supported; /* Supported mask for serial_rs485 */ --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022082.outbound.protection.outlook.com [52.101.126.82]) (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 63E1D29A9C3; Sun, 30 Nov 2025 10:45:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.82 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499555; cv=fail; b=gZUC81yv2XCvs7iFC3z5XpVnEcbiJ8pmRgLNn0iOf6WljvuyO2wBcMM+5P2KiU6cLdXd/QVLcSj4N+sctlxivZifniKliZraBOuKuMS4lJcxQ00PcYV4NxbIfPodnInu8QTcNvhvU1nrUIVSBFbsjVbV+2ifBE0dM+xu/zkQ8FM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499555; c=relaxed/simple; bh=nl3k2Mj+c/mNFaNGLjnuWDtymxTzHWdR1zkh1hYCGTo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=The6jbQ1EUNFEId+AhOFwaC9uCG+z8jmBZOUvWZPsZcBsDhR9e5wq7icV6/iCmFIdTowQb8/TNAvrh4lIr6l0KvudZn4CAZGnGXaiafn1AVbRPBOa/h6IOzmrzGwp6VPeddj92l+hAcDCcWaYSlocuh2dXEJ/XkBIEtGsV5avOc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=bwbQKwsT; arc=fail smtp.client-ip=52.101.126.82 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="bwbQKwsT" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=V/QLEFs3CTg8isBs8BgMXSR+pZaKM+KZNHgHIbxiGzSspOiXNE+fzL1ThMx/df1SzkmtzBmbAzD7/in9w3CFPPJ42Q6pJJR1Pecub8BROrWjcsejl4AuRRAuMSYFwVx6Boy3rtWjH1CjuKthRQxLO2UMr363Cv3gHvmTKFsTTD7c0kbPhMS53j/yIH7wD6UhJuVVJziRf3fFCLw5P+71zsu6sS2bSWx6bU2CPfZkE0ncCXRjkGduVkg+UmGFMBeT21AHZ240bZQVCk5ZMliuCiswtgK42USFbeXJ8Jo6+lWDiR51IlODMUptwVjKXgjY47MJW9zRuAK3l1J+UmrxFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=pV89XLRrF9SgxFg7bvnJaNrsTRbOKPOjUimAI+j+AP0=; b=tbzXRf534QrqhDRfC3STyQGblbWDeOBVUPGYPmpXy744RpRVXQdQlZlxQr1csDT45xuiHTTQUlhxBueJUqYGWvnE7WpjkbOYZb2NXTAk2IjwUSp4J2OVv0PichDynoJ3LAlFCZBWgm0VZRm3G3ELhkeZYpUe59ZY98+riU3dDPm5TN7Hcus6vBnNl2sk9WCOxVvEPCyTnYD2dbSVwWa2veTTUarHlTVjc7n359dtb8XYwKwF3fUJTOlEcXmRwiOBlafyzEfXwdHAyVB4O5CDfR/Ti/LgcnEedfTsoHt94m6oPArzcpod/BaSXgo5t5EFs5T8rxE/ELnFPAqZUoUMYQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pV89XLRrF9SgxFg7bvnJaNrsTRbOKPOjUimAI+j+AP0=; b=bwbQKwsT7TLec/qOsNmZjytS3+8M1HnMSxxMPMDdHh0mShM7H67AHX3Aizyo2Bsgkx94VfIwxtMH0xvj1PEPtKYUawd3nCH7kPMvS/c9ZR7Jxm9Lm4F4THQwaqD0Y04yFDXXkRA3N/lrNnFOE5pzk3FX/noF8AJwydGW9HuolMs= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:50 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:50 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 28/31] serial: 8250_mxpcie: Track current serial interface for later feature gating Date: Sun, 30 Nov 2025 18:42:19 +0800 Message-ID: <20251130104222.63077-29-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 4f642d06-5050-4938-152e-08de2ffda081 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?P2yCoYD9yU1rTaBw+roZ6kIFqHl2tx9SOTEieLHSn2eTGu+YTpqWB8lE5t1a?= =?us-ascii?Q?/C/so/0sqT5i7Wxqv2QXC8Y/pmvJHH6Fp+3mYd6+rhyZKg1rN79FrWro5SX3?= =?us-ascii?Q?QQQm/zOhdld52G5juV7n5ahxxSbVGTLkRDRfJaLeWcyudaobBwslCcMvC5c4?= =?us-ascii?Q?xyd0MJSf8qnTZssRRbQ1Ju1yAP6RGGHsQiVlFL1R07pkZgwJHia13ftOj0nd?= =?us-ascii?Q?fyqyqnUpPns/TiMU8QcArInnqem3eJ2QRe8iLySCMqrR9ZUEKu3SAmylKCJR?= =?us-ascii?Q?N/OfDMhu79DoXFjGXDaxY81xkt0f9PtMxhEz8krxuPcoURlZWR5DuJtI0KA2?= =?us-ascii?Q?96+JD+n+ap95OTYkYoDYPafRYydpQeBPe0N6OZf8uKZylZ8a4GurFT0FwFqL?= =?us-ascii?Q?BQL34MIfC7YM9qpxzn9mIAA10DyJJdw+WLEQdHxUNNtOg6O3jWsRLExWx7zC?= =?us-ascii?Q?wT3NGdEa63jyQ31jVXVh4GXEMj8AQtvIYXUiH97jqBAmgRZ1KDGlhZ3sYXSD?= =?us-ascii?Q?3SciChH5eBBmxkc1GPxLKzNezoPXPd6xvE22NFG8wN5nWMRfJoEG2tzw9ZTc?= =?us-ascii?Q?Tx+etcFmh28apokaTWC0vlnpxgzfH3UEMZj9ewk14RtrLNa65vpNpzcYxlp0?= =?us-ascii?Q?xlFGBgQdho4gGEEUYf9yQlG80wVfle9LMGa4M188Rg+/IbVsTGg+4g5xBu4I?= =?us-ascii?Q?Zc6iX8IGMj2bmv99acgYMnsjvKfdrUY4Um8f8QxqbokPpPzlA+FH/xBXPFw4?= =?us-ascii?Q?CB+2gUR1zply4bfIFB6JnmMYCwHoYQ+OtMY+qGOAqV63S1z6NUz9a/wWCHez?= =?us-ascii?Q?QUhguIDkvx2eYgXsREQuRDJ6OCI3uea+PlJ8+20XmhNfjThH5NZo7mPtKGOO?= =?us-ascii?Q?+6hMtYSepvUNtBcQguWhx4urWOOXVY+yTh7aUo18uXGz/sLFQXHZCrP+a0hb?= =?us-ascii?Q?4k5if047xSjlzdMrjEMZeorn9F3WAnhPsvXW64XoJ3zjnL8Tradcp9Ay3z/N?= =?us-ascii?Q?+Gy2gbRyaZwxE+000RG2u87N6gdhmIoOhJzuIjn+K8ojVXi06ebW3jCkSOrp?= =?us-ascii?Q?32VMDYqskfv2yPtNAYHNojaK5itYTXgKILUvA52uPVEM7drVxeuOeprBzuBA?= =?us-ascii?Q?QuauTax4RBJGgWNir5Cv8sD0tGKOHn/ubH93Cp4O9eaZojATmcffkbtIPlpj?= =?us-ascii?Q?/a7OJ7UCDJjHj4qDYaJbZOTgbaDwG14CUTED8T1lIO9vb7STQLdkLD9B50G0?= =?us-ascii?Q?TkDG3/Ob/n4EE3lztjqShE4+eaTm7WidFcSDFIOJCbQdYdYjkBvAA8OpTTdx?= =?us-ascii?Q?qV6m9Cw+ax8lVLlHE5TWHclJ7cN0DIJnack1xBWMIYJLkcWbWurVtjUfwSZx?= =?us-ascii?Q?uK4jL8atj/I8wna2Y6MTX8eZyEQXwn/sXbqqmT5zagVQX1gTYQ2+grs2Cxat?= =?us-ascii?Q?MqjFuBD1Fzsh6VKq6BSKMEdasLYjI46m2qyWS8LLokqYEicLRb0pHXEZw4ia?= =?us-ascii?Q?8rFyFjLqmxEcoWR89VjEa9tOLecGyPLOEA+0?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?FAR+BTirzJ9DDagFZwwqBoGxWAEFfi7nD5fRtOom9ms9mujfF7/FgmTGk+J7?= =?us-ascii?Q?KjtkUWsOtz5LLed1CKCs5OI+4SfyD/q6wzGWc2ge+/bzPEyfwrO29uegMVPY?= =?us-ascii?Q?1S6npkvZ1BviMkYQXEtzvZakMARsbY5DSSaa+ZUGEctf/eb9yRnmXIkgVPlj?= =?us-ascii?Q?OWL7gCUvdUPh34T5JaHsv+CzXS0VShSM4Dkg+IXZiacefpmGyvCRE0j/xTGH?= =?us-ascii?Q?/UE4X0j1yKbFlWB1iz+PX2IMcBG+KIl1QYtVXmlNfgNRM9sDX1tOoSJ6/+fL?= =?us-ascii?Q?MNg2Vz3z3h5Iw4e11kWn+cVmaomf1TDFKNUpsDQHrcD+5PCjtwvT1BJSH7D2?= =?us-ascii?Q?I4Pi7WAbSfDu9QEKQsYD8dsIDVTmObtsM5jjQF+UiKeXHMIfk7us+nymsEbT?= =?us-ascii?Q?PIGGLXiJmWUkyQ8nUiRoIqQ/D1XWF/fmqjsWriM2E6EMbTe3bND87x0jKEHB?= =?us-ascii?Q?Tcu9/I73YhrjBMLydyXFtbvjB2t15UtW51zdC91Hn5YZmAK3znUgf79VKBn+?= =?us-ascii?Q?ueB+7H1lxEBIc+jFUnSSwBZ+ygNnvB/aKgDsQvAQdoOOKm8fCRhjmOKKE3AB?= =?us-ascii?Q?qh7chHj0aNhb6aqYm4TDEyQwEDbsSI91e0Wz3/F2mCPk/JrWWSud++vmHH4f?= =?us-ascii?Q?68XHNmjlIoQDbiOfxm/nZcHwEq9muhPjEYtyBbo4w6U8VqRNjUm5c5zun8+E?= =?us-ascii?Q?G2AjNUNVKcZzp+VoV/XwgKSRLquQoBPI22UlU5BbKfYDLy2FZhngTVTsvwim?= =?us-ascii?Q?4V9xFNLRS2fqYBmi7mrPiYc2I7cyxyu4cw6k/uitd4pX3l2cVvEyTrYmECHh?= =?us-ascii?Q?73gNdQYFwCtfT2hUhJFRhXF/UrORdmGTmb794PHDyko00Cxwm1IEEsbef1YG?= =?us-ascii?Q?/Yopt2LNBXkxOuiN11lrIan+UATz0mWHx5qzjM4iZhYSXxR6GyQ1ODVjew2m?= =?us-ascii?Q?ffriUhDVgeEPRhS0ZnEyQGr/eihrOa7fhwGOqzupKkddV3ylawZDphdTFjyc?= =?us-ascii?Q?DZIH4eYHoklyTKYpi6n4nBgXvbvArTyI+NL6yEF7/jViR7TJ6sGbqv7yt1p5?= =?us-ascii?Q?Qm6Txtqg7x6PUEOfHkKdYTjkY6MpUHK4FRZ8EAf0JL9RuTZ7l9Bk6xIWWnSx?= =?us-ascii?Q?7QkiqtcsBznJ8fXqoY/J8Fz4N3QwW2TUaim38evhEZD8on3R5hI6AASrtr3Z?= =?us-ascii?Q?9oqLTL1kzYQnUgS3YGVCh4xAEXpspodzpUEXoufpb/5Lx1PH51Vq0o2CzeOf?= =?us-ascii?Q?junmSdsk9CiQZiLk3kS3MDkZ525Lm1We6ymtB7mHnH9kWsciwEbL7tD1Tu0Z?= =?us-ascii?Q?eZyOzs545XuvW5wSEBhlppls0UYBbQ6o38l6KsOCKILhdMBmHBjrovn1T6Qw?= =?us-ascii?Q?rj7zTcYDeeI6ynrLcgyRuaRIsNWmEnZ/kDAX49tD+KzBWw5Wts7arL6UMKk/?= =?us-ascii?Q?YaIIccRXNUure1gyhuT2ei+rj8OEkQn/z0yj/ytWTSSm8lQCHwbxZ/HEKjqk?= =?us-ascii?Q?6E+JobzjTpvKUg8BvjYmxsncCfWz4Mota+AqX/N6EWv12YTH+RqYOIW8t16b?= =?us-ascii?Q?xJO6yqxGBZrrjv+I2JAlY6seJtTsExYWFpSi2zeQ8b0Imw6SduHBMMPaGWZP?= =?us-ascii?Q?4g=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4f642d06-5050-4938-152e-08de2ffda081 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:50.0774 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: /IpTzPYMYYRWoJL59QZ1CdKAzEMzxFowQkguSMVV3X3UYPnk77VgQnXTCV3GY9yE2plUtJZbuYIM1VOCHccqJRY94nTlUHfrsA0yqZo6N90= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Introduce an `interface` field in struct mxpcie8250_port and update it whenever the serial interface is switched via mxpcie8250_set_interface(). This allows runtime checks based on the active interface (e.g. RS-232 vs RS-422/485) in later patches, where features such as terminator, pull state, or auto mode must only be enabled for differential modes. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 88ab918fd000..7a1030a47b00 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -128,6 +128,7 @@ =20 struct mxpcie8250_port { int line; + int interface; unsigned long event_flags; u8 rx_trig_level; struct uart_port *uport; @@ -505,6 +506,8 @@ static int mxpcie8250_set_interface(struct mxpcie8250 *= priv, } outb(cval, UIR_addr); =20 + priv->port[port_idx].interface =3D mode; + return 0; } =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022116.outbound.protection.outlook.com [52.101.126.116]) (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 679EC283FCD; Sun, 30 Nov 2025 10:46:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.116 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499562; cv=fail; b=Uk0l7W+0p/v3BMvqSqkgMjB4tZXC6NJy7GvtrPZV37E+MTI0t2OvYKeKFFCozD7ahjA5zZlwOc/JINzQXz9GazcwRy9nx5AGJiA09iTs97a08mjf8WoRAk7ahVDpkEQqvNV8IDfGQT6DeuEofhqibNRkSzBhVAvNADNM9ph4luU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499562; c=relaxed/simple; bh=JRhnAICQSxaJ0EjLSf5XeCuhRDBqXAd/uuQj31IRMXU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=DNODK6eHT9f52rn1APhYdTpEBjh51f6ptZ4Rp6dDL/DLvCZgTZE8crkmpOJKiTr2mN3kUueOCWMVp7ojIyQWo0d7HYQ8yqH7K35FIiFnUAUfS9ZYsK7hKD1GzFXiWpUAICk9KFR4pmD7iK1xCDrxb5KKLsYd9gQhCMov4+EIUds= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=B+5EDqfQ; arc=fail smtp.client-ip=52.101.126.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="B+5EDqfQ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ARuWolVD+MTo6VofELSbS4eSvjt5NOhoDvoldyiIVdOLogFZNeRrO50d8bobpf7lg8bIQbgJlCllS8qCuIDxJ965tXNvHP0cfNp4BPfI2w2XrxIWQkALiWQ43+w14Hdh+37HkYbLW7xs9QxLnVhZ9DLbg9vEJUnCrnIFKd188MIuViIqO4JTOoAMmaBB3TlUYod72vqe0WM+cESU5ByupSJyTzX8uVoQHrZrujoofs4AD6gFCWb2+DIEfJ/yiUCMfgTh/ItaAO8ZAUkKYlgwKErcheR30XymLqqkLzD148HAU+utzFAOO1ROs3+JUBbt0rkgc+cd6IG3Bb+y9PJrAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=9Xft3yKfH4zGz+s7gSl3AO7wkd+svHdISV8rmSMCHtk=; b=Kj72loSeiBe2diBrYtzR2zBiHqzjALc4CwHXTJJ6lsF05CGCbeHt97ScEqIIxPLnAsi7WPqNJHBtJpyQLIVP2fPcX+vM7Z7bZ3G3bKAEdtrpxPthvKmdtjaU7MiRtvefwCFUkttiPd0eqeLev9KzRevxOQ3kpcOW77wojciMmOp1HWbKCxbt00AycWznL5BnOiKQHFZNb4nDu/Cf/4QH4PbmNntb0P0TqsTb3LwEh9ONPII1URpLzr43J5ZZEyjugpCozIgrG4pjjmyNLaCS2CXwEVtYu/m1yX4kaizSgeQT649HyUE3O6PhXWxYElk+7rxnUraXycUmAsyRZ74vjw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9Xft3yKfH4zGz+s7gSl3AO7wkd+svHdISV8rmSMCHtk=; b=B+5EDqfQ29jXBgzCgDGBhqRXUNS23R9ABbutA/YmAXx67hufbLXPLKjg7NdJiz+3U3UFUJuvIKBTio4iGvfV06qr9fABbvy7YRof7fiq+5LhZoOrxeuJL21tqtVJ/vh+Np9RmyVEjUHM9XK+qtHnPyG8rUgvEa8H+TiMgE/FA+s= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:45:55 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:45:55 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 29/31] serial: 8250_mxpcie: Add sysfs to control terminator Date: Sun, 30 Nov 2025 18:42:20 +0800 Message-ID: <20251130104222.63077-30-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: af019cfb-29b2-4a09-1c79-08de2ffda3c9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?I7jNhSzQ+apsWCijCLtZUJhoIEo89lAlAxGsYl59kxYHcJHwYMMTEvFQJUbr?= =?us-ascii?Q?j5gsYJJDQluePIL3QxTGahEs9A6uNSmMgMoaP1BJPfblbTips/wg3TlT96dN?= =?us-ascii?Q?cGvTo5iGzt4oKquK3eb5V5YbDRmHJxzw/5jcI/JyRlqpxtJPrjTTeQ5fwi5D?= =?us-ascii?Q?aI4qktlLWlfKp5QlxWOFfBlqf0aW7WvXloa7SePOPxAdDdB6rPocgwo6B8dJ?= =?us-ascii?Q?v57jtnKbbSrj1XQAlGMlcq8cveRQ0NIt4MKOSz0lV12srEHpD38BUSuFimjw?= =?us-ascii?Q?29WgEqa+2IrWCp61m8Em74801S1+4G906Qgv0J2fJGnPfWSw7ObD+xHVwImX?= =?us-ascii?Q?VuBRMx+Ru479I+w8USz5VTVV5VqH5TSHRQOdk90u3WXArQpvSRrvIbwhVBH4?= =?us-ascii?Q?RVSPGTebPE527QjbmwOIX6ZRdV539bKUwSlwh0JBL2tlm5DxPb8F9tYN1AoN?= =?us-ascii?Q?r76DUFBSPxHU3S5WUUkuT0nlzxxZE9ySSF4+SqecKHKQSKBDB6DZMthebqgg?= =?us-ascii?Q?8oUFV/0kE2jih9c9oGgbYldi2ljWSFG6WIwLKQlA+0bykBVuGB6NHIMR3MAY?= =?us-ascii?Q?UoMB7zmGqUaKVRZbFJWdR40UMfUj01Ka3vN6By/71Ps2wLZGDMAY4OWGTgav?= =?us-ascii?Q?5AXT5YeY6+gYcZ8XIHlw/WYurF6r6yED7sRBQ3dJJhp0pUuj7CVbb5ahx8XH?= =?us-ascii?Q?veF8LqXjCYU88EEFFPYP2aIQdgozQeMX7IlESsT58BhCiTRXJFo+G8fl84XI?= =?us-ascii?Q?tI4vROk/9C6YTXlYH9yyvdKebF9Bk0BhQ09t60sNQLg+SL+HUiBZWHcZbEHc?= =?us-ascii?Q?2jeNRFy99nnLHQrURRbM4uaFWWUFwI/ACdib9O8oESBu4Fqox76NygczgviV?= =?us-ascii?Q?uMSVLw7zVg7S7VMMug7/72iDJIh1yGs6mSIjMmV6K9AvFaUPdunAWh0mGav4?= =?us-ascii?Q?LgUDFjNP1i8qV+ffqcwzXHzJcvGeQvZVUYr3sLDmrygBwf/0LIYWCjRdvHn3?= =?us-ascii?Q?HK7MBQ9tk9iiX7DhqURrFW3y7GPeIrPeRpzFUYvO+sNkL+r0qYwwdWd6oJch?= =?us-ascii?Q?ClTOR4jtMIDfZjbRnVVvc+zi7oHRTpX0zUCJMd74krf0QyXxzxT1FSjsxtov?= =?us-ascii?Q?qW/x8PAL8JKbhwPjfPkP2qjERnp8gKK8GQ6kcHYaSuDHGQCxg91reGkfbzVS?= =?us-ascii?Q?s6uVi1VvC0jb1Nr9+xS/b00BoDX83wZW33OKRKxvkdgmXe3quVIJ0Uvud+xn?= =?us-ascii?Q?U5781Hp3issptwNmsESRhVT8Q+VjmQKcVxZlrxZ4Ro5VB6MwyVHj7SCZ+idW?= =?us-ascii?Q?fX6u2FIvkvQaUqe5FTynwjTBLyi0xbZRLmRPHyzp+jmM56wrGNSOOVRd2cip?= =?us-ascii?Q?MEhZnbbtVZhCNnGalwzbsbwYDAvYnbp6Czo4T3DUddBH6SwTGxbGLBSOtF4x?= =?us-ascii?Q?NqyWyB6xT7vJEAIJzcgkPTKuopsTL86WHYED5P48SPXpoNRatTiDFr6rKGYM?= =?us-ascii?Q?iJGZYk+p8xVIDgnLbpRbBTy7Uwcg3tnJxbc+?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?rVtmlEgXq9sCe1f3vZ9RrgM3exEBE6b67Kho6vpvwX5OT2WKqiwdHmMnHxko?= =?us-ascii?Q?vlLS7shgmtpRKuWFRvIW97KpwPFy/FHBFCkHjIJEUbkZEfpAAMKB4Y4GcIyL?= =?us-ascii?Q?sLpl9IhGaKEmZneTWSJvSXaW6MMf949nXUaaI5mAoFzGtBQMB9GxI+AmEIvb?= =?us-ascii?Q?kpD/vUByVAwVw87ZJ3ghyY1CoIdshRuyM+DPt/rVKGWsSc2vSa1/Dt+BgZW3?= =?us-ascii?Q?Fqwq0QXFDGZ7/h5VxZla8n4VtTcq4VOWofxKtc6hao2CwnzOuqtguwTmILY8?= =?us-ascii?Q?/r85Lx/V1XFlYrL+DIfPmznb+daqRwwb5FCxsDJZKRc84Wbl55z92IA/4jrU?= =?us-ascii?Q?qJmVU6f8m8AIO2tExuVk1ah79AfVR18bvYDyuF7A4bhvHpB4+5Uq5B16PXG5?= =?us-ascii?Q?iNjZvZyVkAAh41q1AeceUt7tA0YDUcBcrl8ARsEZfQ7xZS5S++UOUJ8vf9MV?= =?us-ascii?Q?hbbuzu8ApwHWV/e53WJATB445+YiskmDxlOIXgJ59Odt6tzb+sMScYcdPou1?= =?us-ascii?Q?nrTK6lciYeKQPpZeLEgWfCb0UcC8EnFA1iyWunnNUKquh1X/mQBEbn8g6Hbs?= =?us-ascii?Q?IymsOMEBfU2zSA+RvZktCHE3q52nQxXxLPaVf8hv2Y57vDOecmU++kQaWzMQ?= =?us-ascii?Q?9Q1gpqWUADGYAYZ9L9Q2zYHalR/Sv88yOomwiptRQsCVYSsVLolqD4qsw0yB?= =?us-ascii?Q?0S8EN4w8BTtmIdrrswu9dr+NZ4k5Lcc1odokSqQEO1Ff0Px0WzNwW6yA0+rj?= =?us-ascii?Q?X9mAwGBuDxTTzGzz0IG09po1vYjJAyIl7K8pNCRUC1t4755Mwc44KDMURkT4?= =?us-ascii?Q?JwQD8a4Wdh9BIajf3zFs/9xQObWNfa5vfZY9bKd4Nxk49bDoqNL+jq8YdJpc?= =?us-ascii?Q?l8PD+AkfdAqmgo9KIKxGQkP4a3WWgYlg8orrkfy8mdSKMyzL7cR/pL5cds0E?= =?us-ascii?Q?1fBAq6kkxPa1a/pzGqYZAI5/Uq+NgYl6qjMWb99MzK2dZDJ2ZCOYoJqJvg12?= =?us-ascii?Q?5d0xZWU3eznEGakdDZU40sM60R92H21pfvXIZV/M8lDIQ9F4Pw8jbgkaTRlK?= =?us-ascii?Q?F60s+3MjBtwyrzMthDhjw2uo4xkLC/ke8lFkP8CrgktHVrBpB4xnfG9C9vTy?= =?us-ascii?Q?5et1QZTO0WLNIh0QvomwU/sqs8VdSWtGo7p9Gysytq+dhvxV7baybmwZh8TS?= =?us-ascii?Q?SibsMaZgAtwvRN71k5PB2/EwOOcE7pJkUudm7AKlILDOAhItB22nJ9HaK1lZ?= =?us-ascii?Q?tooRm9feWCn6RSib37xevJIhMvVoiKuTzd/+W861o/1SL8/DHrX8oY/fYt0X?= =?us-ascii?Q?9yZrR4fxwVfF6OeTn0O0PtsvK6vT5TQ/5SKfsTYaY6JrU7HIIrsSbPF/7BxV?= =?us-ascii?Q?X0bewOXVP1N03LJWp2F8grQIF3ArXD5hu2Qk6t7D5EXiD2nl9IdHEMfEmr8c?= =?us-ascii?Q?gigSRjrWubR/zRwlgQNk/PZb3Chie4YIFwuUSBEjW1PZA3Gw0PSIN5SLLd2d?= =?us-ascii?Q?Wfby5zdBHLe64uIe7JfVCQKydLGpNbno/e2HsOXc+/vpa5mXh98WMc7SOe3G?= =?us-ascii?Q?PWar/rQwk+7SqgT+kC16dnUr7NSbZZwPECJc5iRcazU40hmi7wvHWK38G3mf?= =?us-ascii?Q?fA=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: af019cfb-29b2-4a09-1c79-08de2ffda3c9 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:45:55.5780 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: RwljRGwtVzIkRW6Cam0EayRyzmQUZpAgPC4y5VPg2GkSqPxr7ZKXNGp4CB0WEtr6Absi5FbDkOJZFFSzw14XWdVBP8nxMDLZDmZQkgizmGs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Some Moxa PCIe serial board variants support software-controlled termination resistors on each port. Users currently have no standardized interface to enable or disable terminator state from userspace. This patch introduces the following: - EXPORT a new sysfs attribute `/sys/class/tty/*/mxpcie8250_terminator` to allow users to read or set the terminator state (enabled/disabled). - Implement both CPLD-based and GPIO-based paths depending on board model. - Track runtime terminator state in `struct mxpcie8250_port`. - Serialize CPLD modifications using a new `board_lock` spinlock. Example usage: # Enable terminator on ttyS* echo 1 > /sys/class/tty/ttyS*/mxpcie8250_terminator # Check current state cat /sys/class/tty/ttyS*/mxpcie8250_terminator enabled Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 205 ++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 7a1030a47b00..9dcb91b917a0 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -105,16 +105,22 @@ =20 #define MOXA_CPLD_GET_STATE_BASE 0x10 #define MOXA_CPLD_SET_STATE_BASE 0x18 +#define MOXA_CPLD_STATE_MASK 0x0F =20 #define MOXA_CPLD_DATA_MASK 0x1F /* Pin0 ~ Pin4 */ #define MOXA_CPLD_CTRL_MASK 0xE0 /* Pin5 ~ Pin7 */ =20 +#define MOXA_CPLD_TERMINATOR_FLAG 0x02 + #define MOXA_CPLD_READ 0 #define MOXA_CPLD_WRITE 1 =20 #define MOXA_CPLD_ADDRESS 0 #define MOXA_CPLD_DATA 1 =20 +#define MOXA_TERMINATOR_ENABLE 1 +#define MOXA_TERMINATOR_DISABLE 0 + #define MOXA_UIR_OFFSET 0x04 #define MOXA_UIR_RS232 0x00 #define MOXA_UIR_RS422 0x01 @@ -129,6 +135,7 @@ struct mxpcie8250_port { int line; int interface; + int terminator; unsigned long event_flags; u8 rx_trig_level; struct uart_port *uport; @@ -139,6 +146,7 @@ struct mxpcie8250 { struct pci_dev *pdev; unsigned int supp_rs; unsigned int num_ports; + spinlock_t board_lock; struct mxpcie8250_port port[]; }; =20 @@ -448,6 +456,59 @@ static void mxpcie8250_cpld_write(resource_size_t ioba= r_addr, u8 addr, u8 data) } } =20 +/** + * mxpcie8250_cpld_set_terminator() - Set the terminator of the specified = port + * @iobar_addr: The base address of the GPIO I/O region + * @port_idx: The port index (0 to 7) + * @state: Desired terminator state (MOXA_TERMINATOR_ENABLE or MOXA_TERMIN= ATOR_DISABLE) + * + * Updates the terminator setting in the CPLD for the specified port by re= ading + * the current state, modifying the terminator bit, and writing the updated + * state back to the CPLD. + */ +static void mxpcie8250_cpld_set_terminator(resource_size_t iobar_addr, u8 = port_idx, u8 state) +{ + u8 addr, data; + + addr =3D MOXA_CPLD_GET_STATE_BASE + port_idx; + mxpcie8250_cpld_read(iobar_addr, addr, &data); + + data =3D data & MOXA_CPLD_STATE_MASK; + + if (state =3D=3D MOXA_TERMINATOR_ENABLE) + data |=3D MOXA_CPLD_TERMINATOR_FLAG; + else + data &=3D ~MOXA_CPLD_TERMINATOR_FLAG; + + addr =3D MOXA_CPLD_SET_STATE_BASE + port_idx; + mxpcie8250_cpld_write(iobar_addr, addr, data); +} + +/** + * mxpcie8250_cpld_get_terminator() - Get the terminator state of the spec= ified port + * @iobar_addr: The base address of the GPIO I/O region + * @port_idx: The port index (0 to 7) + * + * Reads the terminator from the CPLD by accessing the appropriate GET_STA= TE + * register for the specified port using GPIO-based communication. + * + * Returns: + * MOXA_TERMINATOR_ENABLE if terminator is enabled, + * MOXA_TERMINATOR_DISABLE if terminator is disabled. + */ +static int mxpcie8250_cpld_get_terminator(resource_size_t iobar_addr, u8 p= ort_idx) +{ + u8 addr, data; + + addr =3D MOXA_CPLD_GET_STATE_BASE + port_idx; + mxpcie8250_cpld_read(iobar_addr, addr, &data); + + if (data & MOXA_CPLD_TERMINATOR_FLAG) + return MOXA_TERMINATOR_ENABLE; + + return MOXA_TERMINATOR_DISABLE; +} + static bool mxpcie8250_is_mini_pcie(unsigned short device) { if (device =3D=3D PCI_DEVICE_ID_MOXA_CP102N || @@ -487,6 +548,75 @@ static unsigned short mxpcie8250_get_nports(unsigned s= hort device) return FIELD_GET(0x00F0, device); } =20 +static void mxpcie8250_do_set_terminator(struct pci_dev *pdev, + unsigned int port_idx, + u8 state) +{ + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); + u8 cval; + + cval =3D inb(iobar_addr + MOXA_GPIO_INPUT); + + switch (pdev->device) { + case PCI_DEVICE_ID_MOXA_CP132EL: + cval &=3D ~(1 << (port_idx + 2)); + cval |=3D (state << (port_idx + 2)); + break; + case PCI_DEVICE_ID_MOXA_CP114EL: + case PCI_DEVICE_ID_MOXA_CP118EL_A: + cval &=3D ~(1 << port_idx); + cval |=3D (state << port_idx); + break; + default: + return; + } + outb(0xff, iobar_addr + MOXA_GPIO_DIRECTION); + outb(cval, iobar_addr + MOXA_GPIO_OUTPUT); + + priv->port[port_idx].terminator =3D state; +} + +static int mxpcie8250_set_terminator(struct uart_port *port, + u8 state) +{ + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); + + if (priv->port[port->port_id].interface =3D=3D MOXA_UIR_RS232) + return -EINVAL; + + switch (pdev->device) { + case PCI_DEVICE_ID_MOXA_CP116E_A_A: + case PCI_DEVICE_ID_MOXA_CP116E_A_B: + case PCI_DEVICE_ID_MOXA_CP118E_A_I: + case PCI_DEVICE_ID_MOXA_CP134EL_A: + case PCI_DEVICE_ID_MOXA_CP138E_A: + spin_lock(&priv->board_lock); + mxpcie8250_cpld_set_terminator(iobar_addr, port->port_id, state); + spin_unlock(&priv->board_lock); + break; + /* RS232 only, no need to be set */ + case PCI_DEVICE_ID_MOXA_CP104EL_A: + case PCI_DEVICE_ID_MOXA_CP102E: + case PCI_DEVICE_ID_MOXA_CP102EL: + case PCI_DEVICE_ID_MOXA_CP168EL_A: + /* CP100N series doesn't support SW control terminator */ + case PCI_DEVICE_ID_MOXA_CP102N: + case PCI_DEVICE_ID_MOXA_CP132N: + case PCI_DEVICE_ID_MOXA_CP112N: + case PCI_DEVICE_ID_MOXA_CP104N: + case PCI_DEVICE_ID_MOXA_CP134N: + case PCI_DEVICE_ID_MOXA_CP114N: + return -ENODEV; + default: + mxpcie8250_do_set_terminator(pdev, port->port_id, state); + } + + return 0; +} + static int mxpcie8250_set_interface(struct mxpcie8250 *priv, unsigned int port_idx, u8 mode) @@ -495,6 +625,9 @@ static int mxpcie8250_set_interface(struct mxpcie8250 *= priv, resource_size_t UIR_addr =3D iobar_addr + MOXA_UIR_OFFSET + port_idx / 2; u8 cval; =20 + if (priv->port[port_idx].uport && mode =3D=3D MOXA_UIR_RS232) + mxpcie8250_set_terminator(priv->port[port_idx].uport, MOXA_TERMINATOR_DI= SABLE); + cval =3D inb(UIR_addr); =20 if (port_idx % 2) { @@ -811,6 +944,76 @@ static int mxpcie8250_get_rxtrig(struct uart_port *por= t) return rx_trig_byte; } =20 +static ssize_t mxpcie8250_terminator_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct tty_port *tport =3D dev_get_drvdata(dev); + struct uart_state *ustate =3D container_of(tport, struct uart_state, port= ); + struct uart_port *port =3D ustate->uart_port; + int ret; + u8 state; + + if (!count) + return -EINVAL; + + ret =3D kstrtou8(buf, 10, &state); + + if (ret < 0) + return ret; + + if (state !=3D MOXA_TERMINATOR_ENABLE && state !=3D MOXA_TERMINATOR_DISAB= LE) + return -EINVAL; + + ret =3D mxpcie8250_set_terminator(port, state); + + if (ret < 0) + return ret; + + return count; +} + +static ssize_t mxpcie8250_terminator_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tty_port *tport =3D dev_get_drvdata(dev); + struct uart_state *ustate =3D container_of(tport, struct uart_state, port= ); + struct uart_port *port =3D ustate->uart_port; + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); + int ret; + + if (pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP118E_A_I || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP138E_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP134EL_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP116E_A_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP116E_A_B) { + spin_lock(&priv->board_lock); + ret =3D mxpcie8250_cpld_get_terminator(iobar_addr, port->port_id); + spin_unlock(&priv->board_lock); + } else { + ret =3D priv->port[port->port_id].terminator; + } + if (ret =3D=3D MOXA_TERMINATOR_ENABLE) + return sysfs_emit(buf, "enabled\n"); + + return sysfs_emit(buf, "disabled\n"); +} + +static DEVICE_ATTR_RW(mxpcie8250_terminator); + +static struct attribute *mxpcie8250_dev_attrs[] =3D { + &dev_attr_mxpcie8250_terminator.attr, + NULL +}; + +static struct attribute_group mxpcie8250_dev_attr_group =3D { + .attrs =3D mxpcie8250_dev_attrs, +}; + static void mxpcie8250_work_handler(struct work_struct *work) { struct mxpcie8250_port *priv_port =3D container_of(work, struct mxpcie825= 0_port, work); @@ -924,6 +1127,7 @@ static int mxpcie8250_probe(struct pci_dev *pdev, cons= t struct pci_device_id *id up.port.break_ctl =3D mxpcie8250_break_ctl; up.port.set_rxtrig =3D mxpcie8250_set_rxtrig; up.port.get_rxtrig =3D mxpcie8250_get_rxtrig; + up.port.attr_group =3D &mxpcie8250_dev_attr_group; =20 for (i =3D 0; i < num_ports; i++) { if (mxpcie8250_setup(pdev, priv, &up, i)) @@ -943,6 +1147,7 @@ static int mxpcie8250_probe(struct pci_dev *pdev, cons= t struct pci_device_id *id } new_port =3D serial8250_get_port(priv->port[i].line); =20 + priv->port[i].terminator =3D MOXA_TERMINATOR_DISABLE; priv->port[i].rx_trig_level =3D 96; priv->port[i].uport =3D &new_port->port; =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022130.outbound.protection.outlook.com [52.101.126.130]) (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 EB08A29B229; Sun, 30 Nov 2025 10:46:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.130 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499570; cv=fail; b=inE9HZVmThtBctaq2uhY9/1IoCuCLamlN4DaA47TkrVws/GEM9kQEOCPEaiFroXd0qX8SYy8lcfTHA4ExdAuj+Nc1lBE966JAxi+upIMY+6ofE4yvZ67KueC8VWvxUY980Jbyv5c0BANEavX3QoH2/A5onFhmxifvo5IS3F6MDc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499570; c=relaxed/simple; bh=eqIDt0C3I0ZfV32yuETu3UQVEC/mNtZksEqDPC08bso=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=nIKKEbgPMMA43A4bEhBlU1qnwKuKZRYwacj+SOS5gLqptd07/sMdBjqxLcPMoNUPFz5Tvw6xEuw25Mb0sp2PP/22rZyP+OARGF+e0dDF/u50O28redA5GqBjCnRs6wIDui1cFQRjfGc2HFb8xSTKObFlXsVxvTs2YDLmPP7O0z8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=NQd+JMRq; arc=fail smtp.client-ip=52.101.126.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="NQd+JMRq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IPDepvqBt+K3A9Pe/7guTdq6GqwpBJrhlYw9RXg/78TT0X9QbIR4UsyYpCNG/kuDU/T41cPvcnn0JH5cO/vH4KjRRBPY/tWkC4nf6BDoFWRXZUgd1dirDHPgGneF/B69fR29QBEZnHGjqGhJ+rmufmHFx6/5x5iPl8HyjebGN0lL7mpvQ6l31smuMjNLFe5yomxHNq56qD0+LgCvNZA3+/q8K6cHUrzdA+h0RTvDc58eoHW9qpycZarfOscJ6As3G/VUd328eHy5O9MX9PEq9pNqgpLTccI8yOJp/DRq5R+zHDUZwjYVTWjTo5QTEvN1zAqyNHtnuHiQyQaauT1oRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=tsySM/BVNd6YHtU/UE53frsMpGRj48eAGbCoGwwnLbc=; b=APYaLJIHtn9gX+2i2Db4qxk6BD8BLbR6yvrp9RyXCobox5wI3qT8nk+0leUyx+MQir5pmS++7xolj8BidpIHIbtAdChCIuz6dx8RHZRNWqRdkQojyGbGNUj59pqlLyCzIEf58TPquoSwD76iaxyRdKSJ2ZNAwmwy4+Wm23hOENhhKDaAkB6YbNchxJmN7vzeLMypWvdJ/DjO2fk07ccYs1pAdJ1PxK7QdNngBz5a8+8oRzLf9tuMYVztj1eppgd0PMQmt8V5tuINQrSP41VVGQKntGBigdg6Izu3mAaV5XFU6vi6G4vkwd/pJJTxxZ/B+AVcEXgXnMWAeDTBj8XeYg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tsySM/BVNd6YHtU/UE53frsMpGRj48eAGbCoGwwnLbc=; b=NQd+JMRqMihf1tNofKWdyb1nNzTUY/vpQZiOGpT53tP20Fqfqpu7QaeXFwV9kCo2yAKaYr7GaoSyTfevfJCQwFsGan6UIZHWvHQXZlMVBkn0ffLxIf89MgAmD6MtLu0gKiIhWARI2R4Fd7696/x1J+uEuWTvVIqfBIGyXplFDV4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:46:01 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:46:01 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 30/31] serial: 8250_mxpcie: Add sysfs to control pull state via CPLD Date: Sun, 30 Nov 2025 18:42:21 +0800 Message-ID: <20251130104222.63077-31-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 58b91b61-b408-4254-20b6-08de2ffda766 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?libA1FY2n+2dJaeUUlUe8e1rXTfJ4Xc4gNyMpd0QAO8Jj6wm5C/jj4ni1DAa?= =?us-ascii?Q?8ZA/0rB+aYxOLh0SwKKl86OCoVUirkxniX/xRh7djxvNaskVQTMUekt/nWD6?= =?us-ascii?Q?xmvkumtrKoNwFEFi5x/MQQ0Dq87OdLbq6iFYBZwCMNJFeFth2CcijLlAXAmj?= =?us-ascii?Q?4JrLGK0ktH5bmCRPqZsydWjq+H1vPEOZk7ue36OSKae/9DbzjN9Z9xKnkXYh?= =?us-ascii?Q?ATWACwa8IjDaoItKyFRgsi7cu1k6n94Vj6mAxZUodbxwR6g9QNiuOnDcjMPj?= =?us-ascii?Q?5VDujRfYaAFy++OpzyUWxYlS8mapgGMXKZ515+8ZKYDcymn22yZwVu5KSkVJ?= =?us-ascii?Q?wmeMiRN3B1GtUB6QmraRGYrQqj4j90sjZS7bBOSdaRVtMYgPDvKLwgMetEm2?= =?us-ascii?Q?4whIjLTf5V+LdMHvVATCW6T4RQ3vnk7yadnEGLhX5zNzvPYHzDesC17qONy4?= =?us-ascii?Q?KTDZmvXuVa6BIREqJT1woRCWh/7SSpOhO8kQnLnvKULYROiX/z5lved4UFtW?= =?us-ascii?Q?v6Sxjve9+o2wYI58vIxm4VKgmL09IjAob2mJKmevILUdn/t1ZoNGmuh4C3CE?= =?us-ascii?Q?F2ljIFe2W9O49oHQNR7JEAQPLSm9HsMk0iXy9KOmlx/QVEnx0ovQuInNQO3W?= =?us-ascii?Q?oUQPDINKT941eEuLf1gsFj/bspPOxf/etwKHQXEgkWVSVdfyv/F00ifxZfeG?= =?us-ascii?Q?ADUSFrU/mQZdp82EyICYLx0KEsfu6ZYFJC8tTDRo7h3mBMO4NPj23+LfXVy2?= =?us-ascii?Q?FWnlEZVst91Il01c64qQWA3ro3n5eSrwSLfHptwIDBkq4fiB6MXj1NBWtBoV?= =?us-ascii?Q?sAim94dFnj393RWnIdiBCvx22QE6CSWkQc9DWebmaj6WHpqiGbjjVbb6KJNE?= =?us-ascii?Q?nqq0g2yjJZxSneukIH1JI4f5A3v8Ij9f72iJeCfYdUmC0yhpn1WocWQ76HuS?= =?us-ascii?Q?18kLk5POTh+R1enP3e2RfhMAryaWYwiUEO6xRJlMvmiGrsO1X4DiUN2UXkZJ?= =?us-ascii?Q?hsJVKGjrO3HI1cTZ+vLCKPCfSwcoC5K6uOi9R+6OofdQhM7PVUEExNpCYxYN?= =?us-ascii?Q?0oxJfOyzD7//dzTAMRlc68wEzfduijfUPM+WAEt3ouJXq0YPPXwaeLBfZK4I?= =?us-ascii?Q?04ze0Ep7vrX8cM4ILjK6dpMQyejqi8RiaCMrW0a/akHnD2CDSthRJXcn0I/q?= =?us-ascii?Q?NLJPT0lFRQDctugn8GOrSKtBrl55/dSp0YiI/BbJyhu0Y3314bpictBpIonL?= =?us-ascii?Q?ST5exTG4Fqn4LEB1gk7k/MjHM5Er9JETf3hk8lWOoy2cnzB5mINWiV/jpXt4?= =?us-ascii?Q?CfHckeSRXgWddjnUbHECHj0IzeHUBdu7abLgz8ckXSiqCOfoao0eO0lEsl6E?= =?us-ascii?Q?C5F2NnGPfasYYjBcFUJT3LUxeV9kFjMFEh0XAfvWT1ULmDltDLPLl9iZ5LcD?= =?us-ascii?Q?HUbZST8jgRfbEYnxXFCigHOh2eO3IcQFHnqVicphTAryLTBCMOqTRLE389yD?= =?us-ascii?Q?qoveaDOv85bP+kBg+UcM9kbpI+VK2OKGEW8O?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?R+8kSNbefytcqqFbJ7eZkOxF12+DmH1TngW7jm6aSCxVAhdn7Ptn7ii/oyes?= =?us-ascii?Q?O4zn34U1JWd2iGg9fi0cpo1LaqKBEpEQycCs8j8rK+fL+m+7of59bjpF/vyE?= =?us-ascii?Q?QDm28twt7V6X/hGgs2tDK3AJ9w2Pxzi8wewFuQGv19hnFQfBeV73jazdw1pW?= =?us-ascii?Q?yXTV9uT9ufCa6HIRTYjQ4ubDgqhNMqjHONSgNjk3/UJT+KBWFtTCJ0LAO0FN?= =?us-ascii?Q?lG1/Kdb6zwP7mJGAV8MG9EYpKv6TxwvOP+2B5J96jux3IqCvgvYDL8VL7h9i?= =?us-ascii?Q?6pdeUFhoVXZ4e70ir728URUNAtzCnkHBzk9kCzc8LwTceBED0h/+uhyQB9eV?= =?us-ascii?Q?FAgKcfkSxXSeGVBHkNmBNxxwpH1M/kTdKKdWy6D5s9xQRu0E6ycUUVZL+pcU?= =?us-ascii?Q?W6XEGScQpvX1m0ZFwbLqnnrB50DwTu2c1w6mRB4fRel9z7H3sIBQ/SaPX8sB?= =?us-ascii?Q?u9+FHGIGA3uGXANXGJ90ueXLQOBgnyh5QlUnO5ytLq1/YQFLIeHJbW9S3rpT?= =?us-ascii?Q?lCOMKAHRB/f86DAWO9IwG/DklC5D/c3DEYsjv6+zMIZ0ChfXs4zCBr8eSqrJ?= =?us-ascii?Q?VckKANOCve6z025nRjR4rBktlpJM8kj0+LOc4Jok8nCwoSQ3sSL2M3C51Kyo?= =?us-ascii?Q?G2Y8/vHJ1DqWxXW8ofbEeqKYKQ2sr3jbxpUJxu4qWmjrHIUuCNrcKtJA+LNm?= =?us-ascii?Q?bQITXPD1PwzyP7yYIqng2uooTRXJAmUgm5TCxaIfd3pU9mZBv0JBtH1+wstt?= =?us-ascii?Q?FpMw1IJ5Q9nc/Wp2ct0/Gp2wk7/061CtIZUhqXcMv/W+ASLzWyKBq7FZtily?= =?us-ascii?Q?iHqrQVCGc70VaNR5tCsqmiRWy0fvRi+2kYAAuwqxEzH9wAIKb/Dfc0CW+tSB?= =?us-ascii?Q?yh1W/npC0XuYPDNLgvNlxqyWyq1Cr9Td2FUyCkiGo7QVhzMfgWxgjnCQjutd?= =?us-ascii?Q?3aT6vOdNKZUCpGZjJDhepu3XZN7fQRYzUCDXPoetpkJR2nZhokZQa40+RnKH?= =?us-ascii?Q?mZRP03sSjmZqrXthPdiTn9ntlRw/VjyiGdJqtohKEx1MfDrloBxP174Lak+g?= =?us-ascii?Q?XUuiuR5UPnDcG3vy5VyVLUHLfPI+EHDSDq2PJ2vvJ2aBhtBj84g/zzNeClZ1?= =?us-ascii?Q?6XWtNInZeD/ILpyZ9uCraYhwqdhRcdN2KYqEkyoTaptep3CprYu2mRMBtMZU?= =?us-ascii?Q?ihY+/g3KVzL2Jv9di5CpfXeQauRxz5Vh5UGwewvC8xCEvGmZVudoWhdklEtR?= =?us-ascii?Q?ODIwXNEca7A77eKAFaANlbXpNpH9ZZ/nmbvuPhUL5ubN206wvQ5fTf+2r/gy?= =?us-ascii?Q?yQ2WXGEE96KbOh18jwZCdclNh1zlDAWuR8TJa9wuCDAK48fuxN8SRTdETUgu?= =?us-ascii?Q?HDQrmkUM5PmAkthH9QVcqI8A0CjrcgnUs7OKXOvMGaP7Mz2jamyJA1Ncm93s?= =?us-ascii?Q?pBSerlGlFWRpR83/REZ7fATpUCSjakad5xQ1q7aZp7bNQE5oHVtpYCiyAZO1?= =?us-ascii?Q?o7h37TGy/J4OHaMgJc5GwEh8P7QYt4Hvd1RUCwkepZSRmVWMqx5zYxlqQzHx?= =?us-ascii?Q?aS5OS/FOmi9iCi+lJdIbnbbGDEcM+E3EcxNodszEliKiEwU6s0SW8IIb//lT?= =?us-ascii?Q?6g=3D=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 58b91b61-b408-4254-20b6-08de2ffda766 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:46:01.5752 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: v13tzn/qTwLEv9g5tc1D2SsTDHDfKLOTPTzb3y95BJiNC5MEj2dm5D8viIZDEgomn1/Lq4ezHUUhAbLWJ4VGZQPQGQeLRypXwQRut3zQBWE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Content-Type: text/plain; charset="utf-8" Some Moxa PCIe boards provide a CPLD-controlled pull/bias state. Expose a per-port sysfs attribute to read and set the pull state from userspace. This patch: - Defines MOXA_CPLD_PULL_STATE_FLAG and {ENABLE,DISABLE} values. - Implements mxpcie8250_cpld_{set,get}_pull_state() with board_lock to serialize CPLD access. - Exports "mxpcie8250_pull_state" in the driver's attr group. - Restricts support to CPLD-based models (CP118E-A-I, CP138E-A, CP134EL-A, CP116E-A-A, CP116E-A-B); return -ENODEV on others. Example: # Enable pull state on ttyS* echo 1 > /sys/class/tty/ttyS*/mxpcie8250_pull_state # Query pull state cat /sys/class/tty/ttyS*/mxpcie8250_pull_state enabled Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 133 ++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index 9dcb91b917a0..e9e3d03b7712 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -110,6 +110,7 @@ #define MOXA_CPLD_DATA_MASK 0x1F /* Pin0 ~ Pin4 */ #define MOXA_CPLD_CTRL_MASK 0xE0 /* Pin5 ~ Pin7 */ =20 +#define MOXA_CPLD_PULL_STATE_FLAG 0x01 #define MOXA_CPLD_TERMINATOR_FLAG 0x02 =20 #define MOXA_CPLD_READ 0 @@ -121,6 +122,9 @@ #define MOXA_TERMINATOR_ENABLE 1 #define MOXA_TERMINATOR_DISABLE 0 =20 +#define MOXA_PULL_STATE_ENABLE 1 +#define MOXA_PULL_STATE_DISABLE 0 + #define MOXA_UIR_OFFSET 0x04 #define MOXA_UIR_RS232 0x00 #define MOXA_UIR_RS422 0x01 @@ -509,6 +513,59 @@ static int mxpcie8250_cpld_get_terminator(resource_siz= e_t iobar_addr, u8 port_id return MOXA_TERMINATOR_DISABLE; } =20 +/** + * mxpcie8250_cpld_set_pull_state() - Set the pull state of the specified = port + * @iobar_addr: The base address of the GPIO I/O region + * @port_idx: The port index (0 to 7) + * @state: Desired pull state (MOXA_PULL_STATE_ENABLE or MOXA_PULL_STATE_D= ISABLE) + * + * Updates the pull state setting in the CPLD for the specified port by re= ading + * the current state, modifying the pull state bit, and writing the updated + * state back to the CPLD. + */ +static void mxpcie8250_cpld_set_pull_state(resource_size_t iobar_addr, u8 = port_idx, u8 state) +{ + u8 addr, data; + + addr =3D MOXA_CPLD_GET_STATE_BASE + port_idx; + mxpcie8250_cpld_read(iobar_addr, addr, &data); + + data =3D data & MOXA_CPLD_STATE_MASK; + + if (state =3D=3D MOXA_PULL_STATE_ENABLE) + data |=3D MOXA_CPLD_PULL_STATE_FLAG; + else + data &=3D ~MOXA_CPLD_PULL_STATE_FLAG; + + addr =3D MOXA_CPLD_SET_STATE_BASE + port_idx; + mxpcie8250_cpld_write(iobar_addr, addr, data); +} + +/** + * mxpcie8250_cpld_get_pull_state() - Get the pull state of the specified = port + * @iobar_addr: The base address of the GPIO I/O region + * @port_idx: The port index (0 to 7) + * + * Reads the pull state from the CPLD by accessing the appropriate GET_STA= TE + * register for the specified port using GPIO-based communication. + * + * Returns: + * MOXA_PULL_STATE_ENABLE if pull state is enabled, + * MOXA_PULL_STATE_DISABLE if pull state is disabled. + */ +static int mxpcie8250_cpld_get_pull_state(resource_size_t iobar_addr, u8 p= ort_idx) +{ + u8 addr, data; + + addr =3D MOXA_CPLD_GET_STATE_BASE + port_idx; + mxpcie8250_cpld_read(iobar_addr, addr, &data); + + if (data & MOXA_CPLD_PULL_STATE_FLAG) + return MOXA_PULL_STATE_ENABLE; + + return MOXA_PULL_STATE_DISABLE; +} + static bool mxpcie8250_is_mini_pcie(unsigned short device) { if (device =3D=3D PCI_DEVICE_ID_MOXA_CP102N || @@ -1003,10 +1060,86 @@ static ssize_t mxpcie8250_terminator_show(struct de= vice *dev, return sysfs_emit(buf, "disabled\n"); } =20 +static ssize_t mxpcie8250_pull_state_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct tty_port *tport =3D dev_get_drvdata(dev); + struct uart_state *ustate =3D container_of(tport, struct uart_state, port= ); + struct uart_port *port =3D ustate->uart_port; + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); + int ret; + u8 state; + + if (!count) + return -EINVAL; + + ret =3D kstrtou8(buf, 10, &state); + + if (ret < 0) + return ret; + + if (state !=3D MOXA_PULL_STATE_ENABLE && state !=3D MOXA_PULL_STATE_DISAB= LE) + return -EINVAL; + + if (priv->port[port->port_id].interface =3D=3D MOXA_UIR_RS232) { + dev_warn(dev, "The serial interface of this port cannot be RS232\n"); + return -EINVAL; + } + if (pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP118E_A_I || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP138E_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP134EL_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP116E_A_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP116E_A_B) { + spin_lock(&priv->board_lock); + mxpcie8250_cpld_set_pull_state(iobar_addr, port->port_id, state); + spin_unlock(&priv->board_lock); + + return count; + } + + return -ENODEV; +} + +static ssize_t mxpcie8250_pull_state_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tty_port *tport =3D dev_get_drvdata(dev); + struct uart_state *ustate =3D container_of(tport, struct uart_state, port= ); + struct uart_port *port =3D ustate->uart_port; + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); + int ret; + + if (pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP118E_A_I || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP138E_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP134EL_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP116E_A_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP116E_A_B) { + spin_lock(&priv->board_lock); + ret =3D mxpcie8250_cpld_get_pull_state(iobar_addr, port->port_id); + spin_unlock(&priv->board_lock); + + if (ret =3D=3D MOXA_PULL_STATE_ENABLE) + return sysfs_emit(buf, "enabled\n"); + + return sysfs_emit(buf, "disabled\n"); + } + + return -ENODEV; +} + static DEVICE_ATTR_RW(mxpcie8250_terminator); +static DEVICE_ATTR_RW(mxpcie8250_pull_state); =20 static struct attribute *mxpcie8250_dev_attrs[] =3D { &dev_attr_mxpcie8250_terminator.attr, + &dev_attr_mxpcie8250_pull_state.attr, NULL }; =20 --=20 2.45.2 From nobody Mon Dec 1 22:07:30 2025 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022099.outbound.protection.outlook.com [40.107.75.99]) (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 65EA1287257; Sun, 30 Nov 2025 10:46:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.99 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499576; cv=fail; b=r0Or+AwsaXHys03rhZWcg8DbjSqdQmOWNhp5dvzkmpOZ0UAXgm154JYvqpuZFvwb1WZ9EvlcxgGRsq7DdLPcTarwDMNM+0ifIR39pozq9Nq4kG21emKoH6DTSLC4dl9ojGM3SU2U0xP/CiyIU4O3ZgB7DdW4p9EeEbUEHAVjr+8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764499576; c=relaxed/simple; bh=cbqI3JvyHbB14oAQj2eL6O5H+WzCz6tch6KCxU1rRM8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=qXuTl85Xqz+KNp6eemYiI7BaWYqehIT7YLy7tCV5ElT3I55SU/7yzCmkYZ+IRew2z03S6SeMqK1TwZZi7pbgAeaV7iIumV0X/VBuSQiYBuLEAr+XneGB6SDiZ7MbbfloPlPWVRPvuCACo5ECCNvMliu4NotJSGkeXHTu2SK55NA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com; spf=pass smtp.mailfrom=moxa.com; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b=fdAMktPh; arc=fail smtp.client-ip=40.107.75.99 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=moxa.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=moxa.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=moxa.com header.i=@moxa.com header.b="fdAMktPh" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Wv+X+Q2DtH5J09Xk1pJOWbOeY6NfeHb0ebSFepzG8NjWSiOB2A2dewXtSnNtSILMP/kr4es2POCeFece/54th5ysxTx2m7q5yPL3X8VPPasBy3xzBh4a6529hq+D9r3tNggBb8uG8eg6qUdTzfFdx3U986S0YnnqLmoHoHYzncqOXwtuq+nCw3STZ06EYL80DSurW4BqDdRhh1SKqCICHFQ1F7SaFqVUcc9GGySjeQXBaL5J3SCsUBGz/PO15ub1Z/CqE6Gg6YO5dpYVX00LS1ojpWHr5ab6SXKy5T7N53KcLi7YW51AnXNYRqV8pd6POfSa9J7XSWxScghxRH5B8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=U9ulhTJZOXWCUPTCIvS2UahsJlRXUzw/jGH+GR8Bvzw=; b=Tk5mVhNhpkYoD4SXTaOV4Aufjk5U9CrJpVxYPjaAsSDSToQSU2Nkj7bEZ4iSJ2jIg4mI4V1pVX2w99+i4DEAGsFip2roPFIpbgkqa6cr4yRyoeazyPOYd4dP1tJykngi2FIZ5WjRaU3LVBoirI0/5lfhBDcmx1dIwwP/ITY38ft2QST53OAR9zqwen4qHQHlR7t5mZn46dlbpxfGDkY1p1YYrzhITZiqFuzNvgD8qZaNRk5Vq31gsNAJe+d7WN26AM367s7GQ6av77w4hAEmXI9FDwq48OcNfKjKqYATAlJdHIb7X/cHGfV1nEkyGGaDTYOHZqGsdTYACHXtaKVqAQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=moxa.com; dmarc=pass action=none header.from=moxa.com; dkim=pass header.d=moxa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=moxa.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=U9ulhTJZOXWCUPTCIvS2UahsJlRXUzw/jGH+GR8Bvzw=; b=fdAMktPhanYpNv6R2jWy6YpfP/X7q8N6xn1hgIwnDVJN7Ewt3gVM3Znct3aK08AR6ycZZk7YHy5egxPkZLf3JQYlh/r0orJRRsgCcA8Kgv3a9aKnrKt02vmg5WRbxUUCCjuLa5k92qbvTPEDd42dxFP/+ivORHNDph1f6BMxdkY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=moxa.com; Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) by SEZPR01MB6080.apcprd01.prod.exchangelabs.com (2603:1096:101:221::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 10:46:08 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::60ab:8615:ab67:8817%6]) with mapi id 15.20.9320.013; Sun, 30 Nov 2025 10:46:07 +0000 From: Crescent Hsieh To: gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com, andy.shevchenko@gmail.com Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, crescentcy.hsieh@moxa.com Subject: [PATCH v1 31/31] serial: 8250_mxpcie: add RS485-2W auto-adjust sysfs control Date: Sun, 30 Nov 2025 18:42:22 +0800 Message-ID: <20251130104222.63077-32-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> References: <20251130104222.63077-1-crescentcy.hsieh@moxa.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0001.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:9::18) To PUZPR01MB5405.apcprd01.prod.exchangelabs.com (2603:1096:301:115::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR01MB5405:EE_|SEZPR01MB6080:EE_ X-MS-Office365-Filtering-Correlation-Id: 07cbf700-4481-4d94-771f-08de2ffdab28 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?MWFsQjR5OXdLTTBoUmdLSzJ6eGozdXJvVFVZUWlhazNNY0NvK0g4TktlQnZD?= =?utf-8?B?aVgrS2Y3QitHLytCSU5KZkZEUFZLZ1lXS1VsTEppSHl4UjdOaTl0bmtZZzc1?= =?utf-8?B?Q0xvQ1E5R05adE5tVitOdG1jNklwSGExdXNjZU00MlRuU3lLbVpvNzAyZldX?= =?utf-8?B?RS9od2dTUlB2RXFYcWphQzliV0ZheTRqTzRqdUZIelV5K1g4b0FqNEQ0Y3R3?= =?utf-8?B?Qm1FWStFdkpFTllVeGNKM2lYdjVPNE0vZWhyREUxWlpEdWdoNDl3RGVEWG5h?= =?utf-8?B?KzBnMkpnR2l5cHozQ2liUmVoZXk2aWdUYWhCb3lSdG5TcndvdWZpK3pNcmVh?= =?utf-8?B?MHpSeXBtSkpVa05hVVlwWHZTbm5icWRuaVdqdk55ajlISXdweml0R1hOeTkx?= =?utf-8?B?M0JZTlBTMndxK1gyOFhyQklTOUNiUEo0U2xkdWxLa1F2ck40cy9iZEtyNDM4?= =?utf-8?B?K1FlM2xzYTJHSFBHZytwWmYxa1d2Q1hGaERqRHNmcjBMS2hWSEszdWx5QU9z?= =?utf-8?B?OVFRR3VZMFM4WVI2WXlXdVRJU3psTWthaVpwc1M2R3BwRG1HUHlRa0hFZXBC?= =?utf-8?B?WFdYVW42MnlxNHdUamExQUZrc29rRUtxV205WVhHN0puamptTGR5UnRSUFUx?= =?utf-8?B?N3puY201OHFBNDhONWJNbW9GQ0ZQVUMwSmtjYzNjZGcwdVNkNmg0VmJWUm41?= =?utf-8?B?a2FWVSsvY0Y3YUl3eEt6VnJMV0pDVWU0Um1BR2M5QmxkZVVWUFZNaFRQWmgw?= =?utf-8?B?TVExakVmUG5CZ1pyTjk3Z2M0eTJGc3lCcnArRFRIU0MxcnpmUnVZQjQ4TGV3?= =?utf-8?B?RTZpMytuRy9zY1dVSFY0cWZTYlJkN3RZWUk2UkpRN1dCVXpMek1UOW9hbXRw?= =?utf-8?B?bitsY2MzSGVYdXpnaFFXQStJZHJ1OWI4YWYzTFRyeFJpd05HNVdCcmE1RE5y?= =?utf-8?B?WFd1a2tkL2c1RFUrZHhnUkRsRGkxb1M3N29uUXVMTDR5ZGVYM2g1RUk5c3Ju?= =?utf-8?B?YkJkVnJJdkI1UkZIUWVmRDJ6SlVKY3VSbnB3NlNYSTJqYmovMnFSU3JDNzBZ?= =?utf-8?B?dmVnS3R0TmNldHR3S2tIVUtQbDlwSnYrT08zbzJ1dVh6WldJYUYwb0IvWWJJ?= =?utf-8?B?Ym1iZGRnbVFNVlNXRjVZNW92cnFrM21jcWUyRXhsNTR1MFN0L3dhcWVkQlJ3?= =?utf-8?B?WE1hUTViSkZydHlla2VYem9JN1lrMnhQTmdkODBKdDF4Tm4ybGxjR3pNcU5w?= =?utf-8?B?SkFkMzlWNTNkV1N6NkdUUm1CUVVzWC9hYkhKT3h0RTFaOTBDaTR0R3lFem9y?= =?utf-8?B?OThWU1JRSGkzY2tUZUhvUHhWYm5LZlFpUk9nSWExVGs2em1SVlcweW1DYy84?= =?utf-8?B?R05RcjBQeXBsZ211bDZHeVh0WHNiaE1Ed0pCSS9nMm9FSDFSckxaZUtXU0JO?= =?utf-8?B?TWFUL3lSK1NmY0YxUXFBamlBUW5BTnlKMXhtNm10ZUNobXc0di9QZktpU2ty?= =?utf-8?B?aHBIMkc4RjFGRXVaOFh2bDhWTkNKQUNhUlVVN0N0MDhZTWNhSDJpcW4wSi9q?= =?utf-8?B?QVk1cGNhTUsvSnNQZE9ubDc2bDJocjlOWXFheElHd1NpME55alYzbUJsNnJm?= =?utf-8?B?YTh4ZnVTS2xVMXMrWmZyRmF1WER4MWMyRWhwSXVYb0JnR2k3T2w4L0RZNHlN?= =?utf-8?B?UE1FYnpycmMyc3pyN3VjVktWT0w4cXZSVzFqZGhwMGVRSzBtTVJMb2daTFBH?= =?utf-8?B?VzNMcjlocmxIM1ZaR3JxWE03ODlYbVcxclZiTko3NnNGeDFmRG9ub2FobnlR?= =?utf-8?B?b20waXE4cW5yV2MrbHFCdmw5dFdpNTJBZGIwSkE5S3o2WmptLzMvOTNieTJH?= =?utf-8?B?V0xPTWxpdkQzb3NKaXF1bVRKQitBanBSNEdXcXQzWmFTS3NIUGtianEwRmtq?= =?utf-8?B?UWdRQzNUVjdZNE5qaUlCbERkRmhNODNMbUNNa3hLT3hPNE5lMFE3MVJESlRP?= =?utf-8?B?WWpNMFNlN0RxMjg1UWZ0MXVtNGxyaXVGNW80blUyMjRRYlZLY1kwbnpIendB?= =?utf-8?Q?FVU6Tm?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR01MB5405.apcprd01.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cWplaXFxYmlNbS9EZ3BNYzFnRThIcUl3cHRMSW4yZ25HTXlSd3M0TFFOTGVR?= =?utf-8?B?eXpNUDQwYk9ZTUZDYTVjOVBRWXFXd0lkNkw3MU9QdTNnL256S0hCNllHOU4v?= =?utf-8?B?c21HSFVzeHp4MzFxRjhnbFNqbkQ5T1V2MW9ua0xoaWQ1aEU5MlZuRkkyOUZ0?= =?utf-8?B?NlNFNklTY0VjK1lmd04vK2NkZStCcWtLM1luc21OMVJOSHE5OVNhVk1tc3hJ?= =?utf-8?B?QXZ3V25BKzlFQjNSQVhPSHFXSVhLUktSbVBTVFRrMUh0RnNFSnJhV2dkeVlw?= =?utf-8?B?ck9EWngxTzlVaWU1dGM0SVNOWTcwMzNnL3VsbWZMRERsbjVXaUc0REJjU0JG?= =?utf-8?B?UHpIL3Y0UzVxL0pZRXNHY2hTZmkxb2dvT1VLLzRvUVMwbUZxRFp1SzNLdCtQ?= =?utf-8?B?TXJ4NzFDUUdTakh6dThhRDBTUUxHRXYwcmJFSC9PSlJUeEpwdEFjdWZiNk5m?= =?utf-8?B?ckFFS1RQZG9DU0NLYkRsOVdMcWlCeDlkQmVqRWhhd0p0RTQzbEdVSFNUVHRl?= =?utf-8?B?aDZmVTA5Mk1xQVZEUDhtN3laL3F1M3FZYUsxWUhBZ1h6UFY1a1F0YmRodG9S?= =?utf-8?B?dHB2UERUeERzOFkzWFhrc0xZcVNPeWtMT1ZrUU5LR1M3RHExNU1KK1BsZ2Nm?= =?utf-8?B?R1lSaDZKQTNLUkJaU0hiOGpraWdxK2hIQk40ZzJJSUxocEMwRDArTERwamZy?= =?utf-8?B?Vzh0REdEbjBjMld2SmZkTmlBQldVZHNzSTRkQVJ2UEMzaGNwaTVReXdnd0pG?= =?utf-8?B?UEhLOWo3VWNDZGoxVThiVmxIcmIvTUp0QlEzQkkwZmdZTC9qdHlLZ1ZFMEI0?= =?utf-8?B?UU9iMnlSN0NwbGp2MDFJRUp3eVd3MzIwS3hBM2RnWkl2dkUxM1M5bFZuMHk5?= =?utf-8?B?bDBLWVg1bmpqY1lteGROenI0dDcrMnJidFYxclE4TTRJY1IvcW9oSlRyK2hz?= =?utf-8?B?bTZMRis0dlc4Rnh5YVhQa09ENXFYK051VDEvMHE2TmFhR3BNNW1YdHJjVXdE?= =?utf-8?B?ZFpaV25FbUZZQTl4OVoyWW1UUElMUjd1MzI3UWVtd0VBbWRxSEgxdmR3UEFY?= =?utf-8?B?WU1iU1NZbmRtUFVuZ0E4alNGT0NteC9EUkJUUGNrR1A2TFMrUlNOQ3NlOTgr?= =?utf-8?B?QUs4QXFjejZuVUxkeTYzQllzelFIZUtuYXVUSkkxZFZCajBSQlN1WkVJc25w?= =?utf-8?B?SitXUnlpQUszcFRWTU03ODBndlhDUWkrVG1hZENvMzFNRVlaMTIveVZldC9W?= =?utf-8?B?bmhFeEpzSkxtOGdHN04xODk4K2htdXI5aE5FcS9adnBLTVBtc3FOeFg2K2pr?= =?utf-8?B?VWZhczlzZHRYNnhJRHhFTEtZdjNURER5UGpCZzVRQzdMRW81bEZEZzhTTTFi?= =?utf-8?B?Q1UxQ2ttYUlPdmJQekVscVloakNJc3h2N3pkS2wvekk5K0ZkR0hSQyt4WTZl?= =?utf-8?B?YXFDTXpmcVVGVzZsSlBWYU5jWmRCTFlmTDJ1R3BJU1ZlOU1ueHIzMmpjaUtz?= =?utf-8?B?Tnk2b3BHQ0x3TkpKeUhhNnlGT0NBNzk3cUZPVXcvTkhrZnh2SE9Ga1lmUFc5?= =?utf-8?B?YVRpWXhGK0NLVS9FalJvK1NOcVVqMkh2ZlRlR2ZXcWFGY3BVKzJQeU5veCtL?= =?utf-8?B?TVhmRmlGUXBKbVZQSjdnTFlQam9FTzlGWkpsWlZ5bW1DMUZ1ZHhrTnJIbmha?= =?utf-8?B?U0d4Y1lkajdjLzlKZnlNd1ljQ2ZRUWl4Zm9wRXZBcUM3cHdlNnVsYm9iR1VD?= =?utf-8?B?V2tQQW16S05SR2lSUGJWMGcyQlBlK2wzdm1VVHhjeUVoSDFiWFZjeEtWNEFG?= =?utf-8?B?TWs4SFZsUjVQTEVhNTJQYU1wR3l3TURHQmdNdjJWa1lYSzVhNDI1Zkg4QmpJ?= =?utf-8?B?cXZtTnZuNVlRSlVZTU5raWJjZ1VIOEpEN2FCSmkvR3R3TkFpR3o1OGI2ZzZQ?= =?utf-8?B?dy9jMDIrMTNiejhmMzdFMm54L0J1RkRmS2FuMG16VGt4ckFDZ0ZjUnBPMUkw?= =?utf-8?B?WlR6a1VPRVk0NHlZRU01Y2w2UlZpQzBFOUJ2WnRhL0xwbGJ4cmFkUVpManVZ?= =?utf-8?B?Q05lY1hsT0FkTHQybW5GUXFDaUdsQldGWHFQenVIZFh1WTNoYU1kZGovS1FI?= =?utf-8?B?VEo4WUZWYWNqNC8zbitnelAzWktmWHFIRnJ0S1BqSXFpNlZLUE9qMXRzMkZn?= =?utf-8?B?b0E9PQ==?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 07cbf700-4481-4d94-771f-08de2ffdab28 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 10:46:07.9213 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5571c7d4-286b-47f6-9dd5-0aa688773c8e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: KRpbLXYHhL2KZEkGkEzXJkXee/H172GJhhi0ewNaC/kqsf659Mp5irk0tIln8VAbqUDVOouUGOwUnP7TapHEhbinTFZap79qCZ6cGjZ27xM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR01MB6080 Moxa CP118E/CP138E/CP134EL/CP116E boards support a hardware "auto mode" in RS485-2W where the CPLD can automatically configure terminator and pull-state based on the selected baud rate and line condition. This mode is not meant to be kept enabled continuously =E2=80=94 instead, it is trigg= ered for a short period (about 2s) to let the hardware calibrate itself. This patch adds a write-only sysfs attribute that requests a one-shot hardware auto-adjust of terminator and pull-state. Writing a supported baud rate value (one of 9600, 19200, 38400, 57600, 115200, 230400, 460800, or 921600) into the attribute programs the CPLD baud code and runs a temporary AUTO mode cycle (about 2s) on RS485-2W ports of the supported boards. Invalid interfaces or devices are rejected. Signed-off-by: Crescent Hsieh --- drivers/tty/serial/8250/8250_mxpcie.c | 143 ++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) diff --git a/drivers/tty/serial/8250/8250_mxpcie.c b/drivers/tty/serial/825= 0/8250_mxpcie.c index e9e3d03b7712..b3146cac0298 100644 --- a/drivers/tty/serial/8250/8250_mxpcie.c +++ b/drivers/tty/serial/8250/8250_mxpcie.c @@ -107,11 +107,15 @@ #define MOXA_CPLD_SET_STATE_BASE 0x18 #define MOXA_CPLD_STATE_MASK 0x0F =20 +#define MOXA_CPLD_SET_BAUD_BASE 0x08 +#define MOXA_CPLD_BAUD_MASK 0x07 + #define MOXA_CPLD_DATA_MASK 0x1F /* Pin0 ~ Pin4 */ #define MOXA_CPLD_CTRL_MASK 0xE0 /* Pin5 ~ Pin7 */ =20 #define MOXA_CPLD_PULL_STATE_FLAG 0x01 #define MOXA_CPLD_TERMINATOR_FLAG 0x02 +#define MOXA_CPLD_AUTO_MODE_FLAG 0x08 =20 #define MOXA_CPLD_READ 0 #define MOXA_CPLD_WRITE 1 @@ -125,6 +129,18 @@ #define MOXA_PULL_STATE_ENABLE 1 #define MOXA_PULL_STATE_DISABLE 0 =20 +#define MOXA_AUTO_MODE_ENABLE 1 +#define MOXA_AUTO_MODE_DISABLE 0 + +#define MOXA_CPLD_BAUD_9600 0 +#define MOXA_CPLD_BAUD_19200 1 +#define MOXA_CPLD_BAUD_38400 2 +#define MOXA_CPLD_BAUD_57600 3 +#define MOXA_CPLD_BAUD_115200 4 +#define MOXA_CPLD_BAUD_230400 5 +#define MOXA_CPLD_BAUD_460800 6 +#define MOXA_CPLD_BAUD_921600 7 + #define MOXA_UIR_OFFSET 0x04 #define MOXA_UIR_RS232 0x00 #define MOXA_UIR_RS422 0x01 @@ -566,6 +582,54 @@ static int mxpcie8250_cpld_get_pull_state(resource_siz= e_t iobar_addr, u8 port_id return MOXA_PULL_STATE_DISABLE; } =20 +/** + * mxpcie8250_cpld_set_auto_mode() - Set the auto mode of the specified po= rt + * @iobar_addr: The base address of the GPIO I/O region + * @port_idx: The port index (0 to 7) + * @state: Desired auto mode state (MOXA_AUTO_MODE_ENABLE or MOXA_AUTO_MOD= E_DISABLE) + * + * Updates the auto mode setting in the CPLD for the specified port by rea= ding + * the current state, modifying the auto mode bit, and writing the updated + * state back to the CPLD. + */ +static void mxpcie8250_cpld_set_auto_mode(resource_size_t iobar_addr, u8 p= ort_idx, u8 state) +{ + u8 addr, data; + + addr =3D MOXA_CPLD_GET_STATE_BASE + port_idx; + mxpcie8250_cpld_read(iobar_addr, addr, &data); + + data =3D data & MOXA_CPLD_STATE_MASK; + + if (state =3D=3D MOXA_AUTO_MODE_ENABLE) + data |=3D MOXA_CPLD_AUTO_MODE_FLAG; + else + data &=3D ~MOXA_CPLD_AUTO_MODE_FLAG; + + addr =3D MOXA_CPLD_SET_STATE_BASE + port_idx; + mxpcie8250_cpld_write(iobar_addr, addr, data); +} + +/** + * mxpcie8250_cpld_set_baud_rate() - Set the baud rate code of the specifi= ed port + * @iobar_addr: The base address of the GPIO I/O region + * @port_idx: The port index (0 to 7) + * @baud: CPLD baud rate code (MOXA_CPLD_BAUD_9600 ... MOXA_CPLD_BA= UD_921600) + * + * Writes the baud rate selection value directly into the CPLD SET_BAUD re= gister + * for the specified port. The caller must ensure the value is pre-mapped = to + * the 3-bit CPLD baud code. + */ +static void mxpcie8250_cpld_set_baud_rate(resource_size_t iobar_addr, u8 p= ort_idx, u8 baud) +{ + u8 addr, data; + + data =3D baud & MOXA_CPLD_BAUD_MASK; + + addr =3D MOXA_CPLD_SET_BAUD_BASE + port_idx; + mxpcie8250_cpld_write(iobar_addr, addr, data); +} + static bool mxpcie8250_is_mini_pcie(unsigned short device) { if (device =3D=3D PCI_DEVICE_ID_MOXA_CP102N || @@ -1134,12 +1198,91 @@ static ssize_t mxpcie8250_pull_state_show(struct de= vice *dev, return -ENODEV; } =20 +static ssize_t mxpcie8250_auto_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct tty_port *tport =3D dev_get_drvdata(dev); + struct uart_state *ustate =3D container_of(tport, struct uart_state, port= ); + struct uart_port *port =3D ustate->uart_port; + struct pci_dev *pdev =3D to_pci_dev(port->dev); + struct mxpcie8250 *priv =3D pci_get_drvdata(pdev); + resource_size_t iobar_addr =3D pci_resource_start(pdev, 2); + int ret; + u32 baud; + + if (!count) + return -EINVAL; + + ret =3D kstrtou32(buf, 10, &baud); + + if (ret < 0) + return ret; + + if (priv->port[port->port_id].interface !=3D MOXA_UIR_RS485_2W) { + dev_warn(dev, "The serial interface of this port should be RS485-2W\n"); + return -EINVAL; + } + if (pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP118E_A_I || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP138E_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP134EL_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP116E_A_A || + pdev->device =3D=3D PCI_DEVICE_ID_MOXA_CP116E_A_B) { + switch (baud) { + case 9600: + baud =3D MOXA_CPLD_BAUD_9600; + break; + case 19200: + baud =3D MOXA_CPLD_BAUD_19200; + break; + case 38400: + baud =3D MOXA_CPLD_BAUD_38400; + break; + case 57600: + baud =3D MOXA_CPLD_BAUD_57600; + break; + case 115200: + baud =3D MOXA_CPLD_BAUD_115200; + break; + case 230400: + baud =3D MOXA_CPLD_BAUD_230400; + break; + case 460800: + baud =3D MOXA_CPLD_BAUD_460800; + break; + case 921600: + baud =3D MOXA_CPLD_BAUD_921600; + break; + default: + dev_warn(dev, "The baud rate should be one of 9600, 19200, 38400, 57600= , 115200, 230400, 460800, 921600\n"); + return -EINVAL; + } + spin_lock(&priv->board_lock); + mxpcie8250_cpld_set_baud_rate(iobar_addr, port->port_id, baud); + mxpcie8250_cpld_set_auto_mode(iobar_addr, port->port_id, MOXA_AUTO_MODE_= ENABLE); + spin_unlock(&priv->board_lock); + + msleep(2000); + + spin_lock(&priv->board_lock); + mxpcie8250_cpld_set_auto_mode(iobar_addr, port->port_id, MOXA_AUTO_MODE_= DISABLE); + spin_unlock(&priv->board_lock); + + return count; + } + + return -ENODEV; +} + static DEVICE_ATTR_RW(mxpcie8250_terminator); static DEVICE_ATTR_RW(mxpcie8250_pull_state); +static DEVICE_ATTR_WO(mxpcie8250_auto_mode); =20 static struct attribute *mxpcie8250_dev_attrs[] =3D { &dev_attr_mxpcie8250_terminator.attr, &dev_attr_mxpcie8250_pull_state.attr, + &dev_attr_mxpcie8250_auto_mode.attr, NULL }; =20 --=20 2.45.2