From nobody Fri Apr 3 16:03:50 2026 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11012025.outbound.protection.outlook.com [40.107.75.25]) (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 140B439F17C; Tue, 24 Mar 2026 03:51:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.25 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774324279; cv=fail; b=FutPZhwNQDn3bru67Tn4ldHs/wAg7vnZ1bHNcdjy8rFjn7IfZVu7oVxpNJqw572U1zqZLyJLjeruQnEmGMXH5xRUfz6/5c+g4nprYM7edTVzIEVWrhyorSXjWXNJxFIHw9MnGiXHGqt+j5jQJ8B4aNeUYV7/KMimDRkiNU5cBSM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774324279; c=relaxed/simple; bh=smQVyscc5Bcmhq4/7gvaEmzKhaJnwK4/vJJWpNaN9Yw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=d3HQKNjU1+qAXZKwSNiWL+D3zjm36QsM4+/5/llSxCnaUZHPuaEuGticQ3RzCCROFpZqa1sabAE7JCPl/xQr6MaxckOukUHis8x7hbKaue5ePt8VmUtS6uYNvLTJ7/AF8AWzJb4KBjF8MkiF8poFnsywMb575DFH+PHE4+A6ysg= 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=J4K8F0kE; arc=fail smtp.client-ip=40.107.75.25 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="J4K8F0kE" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BjjLaRb5+SEG0Ugoi+TgijE9HazCDmZij7JUU4aUa8wqf3kf9uAnn6fkLDJTIMI8hZHaRsUnGtNoyaflqpBbLxyUwrTjNmxzwf3KP49Ig3peqIEGcVjbF2o9vUZluDX9tnr5VEsy4aBojNWFcMOkUlZvOB/ZiXgcWKLBvicHs2rnWMy5wVUuDfMW0RB1LEfgL2bq+QTpGFWvuSWrP2bZ85G6HE4/oSEZZYoEupKCGlc5/OKgLgh1QlaCQjHJEunHzXXhsm9MRwaVum7Be/Kv0LOAh25qIa7cRP+0hxypbLOCL3AamY4ksZ+o4FqguE//wBL8OMki146rvxim0ZfMlQ== 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=3ElD+sSHpFq2d6d4kaqnkOZS+spU1gn1ENAQU0xAhSk=; b=K23JyGtlUDh5c+VdBRhbdk++lzo/VWIX88++H1Fj8+sU2pg9QBipk54zd0uh46JjekQkf4H5YMHS3KrmbyKQdlCHskw4rxFeJ5ZUgGzTE3ud3x7Fyz6kwq05P01RPURMWSGCsvuTvVN2hbN0wCtuo8T9EvcvHgKJbjpglDXhFgUEckMFGGMzwK8VySECEOnwSvKcqiTp6dkBuNFnoTAGPOCjc5LBC5MDDYBEoILsHDsoG58wuglxQUKnf3sPuagnR+/rlx0zV+frgVYUU0vD8cLRYlYbNFBEzF8ng18RrPjc8v9Ii58K2PHYw4ZATzfBKRdmw08nYteWt4KPIRIu5Q== 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=3ElD+sSHpFq2d6d4kaqnkOZS+spU1gn1ENAQU0xAhSk=; b=J4K8F0kEm5VyQv4jjZMHBATM87fgvZG1+drL6Y7mJrL42v59cbs33MFWTvJjo2yJyaFqmPFP35pe/sxknuwy2oaeCcZQ8HvfeUyqlQporn4OYzA/uK+bjKOEsaOLTYUpZ7X3BwbwMxw4mHWXo8gpmvyQkNOqwukMujfKs1RdvvQ= 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 TY0PR0101MB4844.apcprd01.prod.exchangelabs.com (2603:1096:400:275::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.31; Tue, 24 Mar 2026 03:51:03 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::ae38:e821:cf7d:3717]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::ae38:e821:cf7d:3717%4]) with mapi id 15.20.9723.018; Tue, 24 Mar 2026 03:51:15 +0000 From: Crescent Hsieh To: Greg Kroah-Hartman , Johan Hovold Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Crescent Hsieh Subject: [PATCH v1 1/4] usb: serial: mxuport: add support for more MXU50U UART devices Date: Tue, 24 Mar 2026 11:50:38 +0800 Message-ID: <20260324035041.352190-2-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260324035041.352190-1-crescentcy.hsieh@moxa.com> References: <20260324035041.352190-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0023.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:a::7) 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_|TY0PR0101MB4844:EE_ X-MS-Office365-Filtering-Correlation-Id: c1257c62-c774-4278-81b6-08de89589936 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|52116014|38350700014|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: K/jSAy59J4odCVGGQKwr1geK/dcwdvDm5rbJZygbZR/LZksD5rgFCQphfhjVi+2srdrNiDPQByVp9ZIDf+lZPGg7PjG7vcA7STAYhka4mL2a6QZ1NhBbUA8IaYu9ir8Czbn7qW50AkxWUGcdHbGEiDcSVXJ+gLT6aFUqrAFRK6Bc9N7gvIx7xbvuHvox/f7WHunu22sWdpuJZCGdiv9Xh4VGxyMsKDXypNZBb7S8COQRGd/f2fF5FQegGu22jAf1HYbshA7U9XqIv1pECcyPpO5JEfEn/JCSoU9wssfykfQqY8KZxjLxqLZXoyAed7B/B7Z39tskfHzgpwu/8R8v3R+o7N2B0JXLbyZm9hO+oIMUbUM39yQFltLzzJ8OAbQINmMsihS23W763HugF5lyo6ducNU5IR68lXcnskcnQhFMYxXDK0hcm3Gjn2cpaxkMpIvBL5Z6lQrq10wE0O0RR699mV+IvZ3QJ4KLYYDVJXulGTTltiiqGGwlvrGsT6zXxB+M3zNDleR1ce5zZXNoV7kcqQ+q8kWO3InHT47BtIr199tWLzM4mWYyd74sn5HSHDDunwv7kyLgWWzRzw88xuVUctldea/oiWW5kk/xy3HJXrfBxx6tA5NGsfg9s1Lyu5kuqzOOS6+yjwYaMJf82TT9SomZSNq28aUfR1o36HdEFUYmepxAIj0hK00U3joSwj8svt3BFv2AILbBjgZAA8wmIb0M8GD+J47PYmQlBq1LxEcubKrMcl/b6nB8nnH929/04iU9xGUyiC5jUt/hAKMZaFLaLIYXn+cDYqQ8rkU= 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)(366016)(1800799024)(376014)(52116014)(38350700014)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?64HnxLMhSbXMF/LLA2ReCY4NERWKfXWyBAe+K3zLg0rLGIgiqwFCsQrBRzvt?= =?us-ascii?Q?dIrWkZmvsyOad+5pArV3NVIEoc83/pJvHyZFanAxr7sWyWDF69EANty2Uy2s?= =?us-ascii?Q?n9QJ8h/zDRLGbjJC3SPdDmlxiXgMlXQ5cZ6mrnDBHnHYqvM/0KG4QJepsMHV?= =?us-ascii?Q?9WKr8bY1/qGxq9IzlS/N75qRk7wGQF14dR71Rbd1hACJjV5c49PhZWja3omy?= =?us-ascii?Q?jqFBS2YNgCtEMuB7Zhwyt0LBwuGTERgVdDJslNWo3kmq3iPXnQlLy0M8/vs8?= =?us-ascii?Q?lg+VCSqSbJ6yGSjv8/y2RfVvNlIxqbrBSTPzk3aeKjOQ7BIbkV3LtryXM4zC?= =?us-ascii?Q?INGQnQcQJc8L75GWhNb/mp+MTT83Ib8pMW2SK/XoucwSuJ37r3sFr40dgApp?= =?us-ascii?Q?vi+F0zvhmo28CcRPx4PFnp+lDFB/YZ7mrZvz3DCVC3lBF2TOrtwqWperfXt9?= =?us-ascii?Q?2KADnKL4hE/7DCXzlTk5RaXlE5o9ZoXooM5rBgYEf5PtQDLRU3jkf3ctPhvN?= =?us-ascii?Q?msFIlKvMQWwGCVQjFIuJBA+JdR4YPgpRgSg5EKSVzsBRJ3cZcBJNOggWvuxT?= =?us-ascii?Q?blK907RnxxN6W1oEk0ea/XFjIC0dxMHQWKJ9gmRO8Ish8kaDEi7g9fYu037q?= =?us-ascii?Q?m0CCd2pj8ybxfyNwNHrvxD5VwCcEXMcUN9o42UHYk/0y7spPbpZlHtfXmhHb?= =?us-ascii?Q?DItPwSr6QasylHSahIoqvl7R5zLYZfAKs3NIwB3Ea03Varw5//89Dd42l7Uz?= =?us-ascii?Q?S2pQOJMGA2MBvDzU8R7rlFJkv1eSDCSbMhR2PXVvcOays4GtXQPi+qQdha/U?= =?us-ascii?Q?y5WbjQmja69LRVk8/Uy97ih3CJmiba+jGQ8mzXU1nEPQslFGeQXPhkmOecsI?= =?us-ascii?Q?uO5Y6Kau39uCMRiKRc2H0y2aMkeKCLiQhFYc8TMIWZiWvviwLm4yIPo37Yn6?= =?us-ascii?Q?INce2RKUrVjeY1q07xmlIDXXlx8wmoe4m8oe9eGa1DKJH/0KQCmedNJ/VMpq?= =?us-ascii?Q?Qo5gPOF46W9hFRiVlVerEcLUmownIAUnTuhkvIKoZxemoWckb72f3nUmU0xs?= =?us-ascii?Q?08ee4Cq2qGXV6LQuKbUK5WnAHUgSzTFkeTTUYFCNCbQVakJ6623SWzLI0u9P?= =?us-ascii?Q?2y+7p7SyMVLguvc0/tQkn8dK+ZC+f2q9/LykmgIlXjfT86pz0NOf42DCYmas?= =?us-ascii?Q?dYJGZCcCdKYyALQqnpk8V0SPdJeWdlvRBqmWrCKcwwqSa9GNHO37VKXzITm0?= =?us-ascii?Q?UFnh0dwtPnGptlHDQJ121w7mkEdGPYQd/ZRpffhhgLjnHNUmstkBQq3jOM7N?= =?us-ascii?Q?Ol6M08HLWLGU8ObUrbQQTh5AQ3bkS7r29nnjCwyWrV9BAM+nukw7mvqmVaP3?= =?us-ascii?Q?DHW4jAbJIiq4ML9tWvMqf/OwbDY2bG52sKpUPcFiDQWddox2KPEdNS2SKzpj?= =?us-ascii?Q?ICGVO40p8k7chI+Yb09aflzTYz5pGSDRWF7GFSkNSEn+2bOU69oh4e745cjU?= =?us-ascii?Q?iUg+LK17rh0ghAf2+JRUif9ChJcAB5n2cFcwVVCVn7U9CEmYNZ5Bk6Fz0Oqb?= =?us-ascii?Q?NfI3p+Qb4dSMa2NRAnQjfXsAc2oAuSxtnxmkpHLxnKk7o5uxN2Jiq2QmIf1T?= =?us-ascii?Q?nLaKz855GQmg1V+o94z+KzB7GYtTiHADeI+Nh9q4gw1mVFce5Xvn6Kd8DqjU?= =?us-ascii?Q?1GRTN0NnMvwpK2zcmdvDhs9IZNipZcJZD3kbA+2piTL87T2Yqfd9NmJCr99i?= =?us-ascii?Q?lrnFoNOgqnxW1vdCPe608ZwOdFl/KYw=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: c1257c62-c774-4278-81b6-08de89589936 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Mar 2026 03:51:15.5167 (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: YwSQo8vb1pCBtVOgS5qIwyykIyCPqoOCDw/h50aSfz0CDBtlLbNyhVdrQJ1aAOVtQMjJVWStlgjNeJS7Ro6/Rycarl22ddgnp0Ggsz1H/Uk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY0PR0101MB4844 Content-Type: text/plain; charset="utf-8" Add support for additional Moxa devices using the MXU50U UART family. Extend the device ID table and port-count handling for 3-, 5-, 6- and 7-port devices, and update firmware selection to use the matching MXU50U firmware images and version offsets. Signed-off-by: Crescent Hsieh --- drivers/usb/serial/mxuport.c | 132 +++++++++++++++++++++++++++++++---- 1 file changed, 118 insertions(+), 14 deletions(-) diff --git a/drivers/usb/serial/mxuport.c b/drivers/usb/serial/mxuport.c index ad5fdf55a02e..034b506322c2 100644 --- a/drivers/usb/serial/mxuport.c +++ b/drivers/usb/serial/mxuport.c @@ -39,6 +39,25 @@ #define MX_UPORT1613_PID 0x1613 #define MX_UPORT1653_PID 0x1653 =20 +#define MX_UPORT1252_PID 0x1252 +#define MX_UPORT1253_PID 0x1253 +#define MX_UPORT1411_PID 0x1411 +#define MX_UPORT1452_PID 0x1452 +#define MX_UPORT1453_PID 0x1453 +#define MX_UPORT1619_PID 0x1619 +#define MX_UPORT1659_PID 0x1659 +#define MX_UPORT165A_PID 0x165A +#define MX_UPORT165B_PID 0x165B + +#define MX_MU250U_PID 0x0250 +#define MX_MU450U_PID 0x0450 +#define MX_MU850U_PID 0x0850 + +#define MX_MU850U_6PORT_PID 0x7002 +#define MX_MUX50U_3PORT_PID 0x7003 +#define MX_MU850U_5PORT_PID 0x7004 +#define MX_MU850U_7PORT_PID 0x7005 + /* Definitions for USB info */ #define HEADER_SIZE 4 #define EVENT_LENGTH 8 @@ -48,6 +67,9 @@ #define VER_ADDR_1 0x20 #define VER_ADDR_2 0x24 #define VER_ADDR_3 0x28 +#define NEW_ADDR_1 0x86 +#define NEW_ADDR_2 0x88 +#define NEW_ADDR_3 0x8A =20 /* Definitions for USB vendor request */ #define RQ_VENDOR_NONE 0x00 @@ -147,9 +169,13 @@ #define MX_WAIT_FOR_SEND_NEXT 0x0080 =20 #define MX_UPORT_2_PORT BIT(0) -#define MX_UPORT_4_PORT BIT(1) -#define MX_UPORT_8_PORT BIT(2) -#define MX_UPORT_16_PORT BIT(3) +#define MX_UPORT_3_PORT BIT(1) +#define MX_UPORT_4_PORT BIT(2) +#define MX_UPORT_5_PORT BIT(3) +#define MX_UPORT_6_PORT BIT(4) +#define MX_UPORT_7_PORT BIT(5) +#define MX_UPORT_8_PORT BIT(6) +#define MX_UPORT_16_PORT BIT(7) =20 /* This structure holds all of the local port information */ struct mxuport_port { @@ -179,7 +205,39 @@ static const struct usb_device_id mxuport_idtable[] = =3D { .driver_info =3D MX_UPORT_16_PORT }, { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1653_PID), .driver_info =3D MX_UPORT_16_PORT }, - {} /* Terminating entry */ + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1252_PID), + .driver_info =3D MX_UPORT_2_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1253_PID), + .driver_info =3D MX_UPORT_2_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1411_PID), + .driver_info =3D MX_UPORT_4_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1452_PID), + .driver_info =3D MX_UPORT_4_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1453_PID), + .driver_info =3D MX_UPORT_4_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1619_PID), + .driver_info =3D MX_UPORT_8_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1659_PID), + .driver_info =3D MX_UPORT_8_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT165A_PID), + .driver_info =3D MX_UPORT_8_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT165B_PID), + .driver_info =3D MX_UPORT_8_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_MU250U_PID), + .driver_info =3D MX_UPORT_2_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_MU450U_PID), + .driver_info =3D MX_UPORT_4_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_MU850U_PID), + .driver_info =3D MX_UPORT_8_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_MU850U_6PORT_PID), + .driver_info =3D MX_UPORT_6_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_MUX50U_3PORT_PID), + .driver_info =3D MX_UPORT_3_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_MU850U_5PORT_PID), + .driver_info =3D MX_UPORT_5_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_MU850U_7PORT_PID), + .driver_info =3D MX_UPORT_7_PORT }, + {} /* Terminating entry */ }; =20 MODULE_DEVICE_TABLE(usb, mxuport_idtable); @@ -944,8 +1002,16 @@ static int mxuport_calc_num_ports(struct usb_serial *= serial, =20 if (features & MX_UPORT_2_PORT) { num_ports =3D 2; + } else if (features & MX_UPORT_3_PORT) { + num_ports =3D 3; } else if (features & MX_UPORT_4_PORT) { num_ports =3D 4; + } else if (features & MX_UPORT_5_PORT) { + num_ports =3D 5; + } else if (features & MX_UPORT_6_PORT) { + num_ports =3D 6; + } else if (features & MX_UPORT_7_PORT) { + num_ports =3D 7; } else if (features & MX_UPORT_8_PORT) { num_ports =3D 8; } else if (features & MX_UPORT_16_PORT) { @@ -1053,6 +1119,7 @@ static int mxuport_probe(struct usb_serial *serial, int local_ver; char buf[32]; int err; + bool is_mux50u =3D false; =20 /* Load our firmware */ err =3D mxuport_send_ctrl_urb(serial, RQ_VENDOR_QUERY_FW_CONFIG, 0, 0); @@ -1065,12 +1132,41 @@ static int mxuport_probe(struct usb_serial *serial, if (err < 0) return err; =20 - dev_dbg(&serial->interface->dev, "Device firmware version v%x.%x.%x\n", + dev_dbg(&serial->interface->dev, "Device firmware version v%d.%d.%d\n", (version & 0xff0000) >> 16, (version & 0xff00) >> 8, (version & 0xff)); =20 - snprintf(buf, sizeof(buf) - 1, "moxa/moxa-%04x.fw", productid); + switch (productid) { + case MX_UPORT1252_PID: + case MX_UPORT1253_PID: + case MX_UPORT1411_PID: + case MX_UPORT1452_PID: + case MX_UPORT1453_PID: + case MX_UPORT1619_PID: + case MX_UPORT1659_PID: + case MX_UPORT165A_PID: + case MX_UPORT165B_PID: + is_mux50u =3D true; + snprintf(buf, sizeof(buf) - 1, "moxa/moxa-up-mux50u.fw"); + + break; + case MX_MU250U_PID: + case MX_MU450U_PID: + case MX_MU850U_PID: + case MX_MU850U_6PORT_PID: + case MX_MUX50U_3PORT_PID: + case MX_MU850U_5PORT_PID: + case MX_MU850U_7PORT_PID: + is_mux50u =3D true; + snprintf(buf, sizeof(buf) - 1, "moxa/moxa-pf-mux50u.fw"); + + break; + default: + snprintf(buf, sizeof(buf) - 1, "moxa/moxa-%04x.fw", productid); + + break; + } =20 err =3D request_firmware(&fw_p, buf, &serial->interface->dev); if (err) { @@ -1080,14 +1176,22 @@ static int mxuport_probe(struct usb_serial *serial, /* Use the firmware already in the device */ err =3D 0; } else { - local_ver =3D ((fw_p->data[VER_ADDR_1] << 16) | - (fw_p->data[VER_ADDR_2] << 8) | - fw_p->data[VER_ADDR_3]); + if (is_mux50u) { + local_ver =3D ((fw_p->data[NEW_ADDR_1] << 16) | + (fw_p->data[NEW_ADDR_2] << 8) | + (fw_p->data[NEW_ADDR_3])); + } else { + local_ver =3D ((fw_p->data[VER_ADDR_1] << 16) | + (fw_p->data[VER_ADDR_2] << 8) | + (fw_p->data[VER_ADDR_3])); + } dev_dbg(&serial->interface->dev, - "Available firmware version v%x.%x.%x\n", - fw_p->data[VER_ADDR_1], fw_p->data[VER_ADDR_2], - fw_p->data[VER_ADDR_3]); - if (local_ver > version) { + "Available firmware version v%d.%d.%d\n", + (local_ver & 0xff0000) >> 16, + (local_ver & 0xff00) >> 8, + (local_ver & 0xff)); + + if (local_ver !=3D version) { err =3D mxuport_download_fw(serial, fw_p); if (err) goto out; @@ -1098,7 +1202,7 @@ static int mxuport_probe(struct usb_serial *serial, } =20 dev_info(&serial->interface->dev, - "Using device firmware version v%x.%x.%x\n", + "Using device firmware version v%d.%d.%d\n", (version & 0xff0000) >> 16, (version & 0xff00) >> 8, (version & 0xff)); --=20 2.43.0 From nobody Fri Apr 3 16:03:50 2026 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11012014.outbound.protection.outlook.com [40.107.75.14]) (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 5B86B3A1A54; Tue, 24 Mar 2026 03:51:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774324287; cv=fail; b=ULI4kqOoNYHgY9DRhoQPOjg4y25pqyJiAajuzDea6RGbi4SCECkRtJTaAe5kIlyw6vy0mHC1u5KNEtzzJARSjvYrArYw0iT1IS89qbA3Y8H8C8qrTnE8dW/wB9k4kzfWAS6gurO6A3ZNw5Xa+5JoZcOJ77W97M5DZAlSRov4DBc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774324287; c=relaxed/simple; bh=p3ewzcSN0wU2GeNfoUMZzCBAdSMpmfjOc7ed5a2atNo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=duvGt6X+hXjxk2Ele3bDvJSJnRSrabHBwKPjK0e4de/SnHmNoJoenQywFIXTMvT39jIGj/zILtrwBeDPOtedzoBWgsFFysCRz5sjDh15LIjW045cgQMdA22cbpOBJxs7bYCG21i0dFGOTgpvXqva9cz5fjOiO8jHhTSCGTiL8So= 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=e7NFHAsx; arc=fail smtp.client-ip=40.107.75.14 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="e7NFHAsx" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=y8v3RRC8jpe5aMpB/dGNvDnfclnWyjHvHEpQibcBH+FuIxL6fEOyuxkh0ZLUCLEJ2kdsBFRhtqw1Udk7HDhzswxvytZRORGOLWx1CTDnb7BIIMSrk2WigE+xm88oWPoSw9nlpfQPfwAjFtosZwUgCcF/MBt5cUolQCsF6VTrul7Y0ruzrJzqBeQGmrSXNEQ6Xtce2MyBUFAu2Zk1H7/sOoc7VVINmXuLi8rSxNUy+OgqMirG82UCqtewnAW+EwnvoAmgPiKGMPFpS8W7PnmM/SVOXP3c7RE8L4twFYHmeQuK1RSvsx9lC/GhuoI/JjcHSH7Px2eOefYs0Op9HnJoYw== 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=KmVtBAcoFdBF4Vr4ipD1EMULifLmippSbH52ZfcZ+/A=; b=XRsOEOdQ2MdQI0yAhq6PXwFQEOji7B4Z2Mcz3XCzbd/1whhxx7GtzJ1LNo8zMO60indliQru2xasfuNalAxu/3AVFvR27+HhDVgENgtTKV2u2coA9/Ji+AZ1IBcqamif80NjoiG/aNJkKhCPYUvCLwcmqzNnRklbF+DNNwtigBSmzqJ86sPEN31PLjoL5i28LHYZonJXPBBb7ufkJ4NyR6ZV+fiR/rd3PvZYXqaqOSSdvCmXD8JS3pJx17lxZiHcucOTFrRLiTeAbKz+Q4G2mFYOkb+BujbYWGaLHhIhckTjdu+tEqWF1FFeNBouGVIhvmQWL5Bqo/IbBp8OU+Ueow== 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=KmVtBAcoFdBF4Vr4ipD1EMULifLmippSbH52ZfcZ+/A=; b=e7NFHAsx3dhU+L+/dJ8OSI6aNX5HlmXocHGy21OENMhD6EUBJ0kPx91A0j03zHVqhTVRzU6qTDqb1DuBAXVllUacotc68VHQEJvanTGUEpyBa/KpY4RjYwULMx/t6/9gh4PCvBhbC6/RdCf6sgR0yRbVHXKACdqWsQiPTq6L0LI= 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 TY0PR0101MB4844.apcprd01.prod.exchangelabs.com (2603:1096:400:275::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.31; Tue, 24 Mar 2026 03:51:11 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::ae38:e821:cf7d:3717]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::ae38:e821:cf7d:3717%4]) with mapi id 15.20.9723.018; Tue, 24 Mar 2026 03:51:23 +0000 From: Crescent Hsieh To: Greg Kroah-Hartman , Johan Hovold Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Crescent Hsieh Subject: [PATCH v1 2/4] usb: serial: mxuport: handle SEND_NEXT tx flow control Date: Tue, 24 Mar 2026 11:50:39 +0800 Message-ID: <20260324035041.352190-3-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260324035041.352190-1-crescentcy.hsieh@moxa.com> References: <20260324035041.352190-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0023.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:a::7) 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_|TY0PR0101MB4844:EE_ X-MS-Office365-Filtering-Correlation-Id: eb941d8f-dc75-4584-a961-08de89589dac X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|52116014|38350700014|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: +Xq2oLYcoQNlwcYkLPWnj+yNQCEfz7PrpYc1Lh6kfFAq+IUb0um2KCm9x8uTaDp5mg8hWOklSB6YjXg9Bow8sy69cn1GPcxh+51ZMG9oWVwdYJZKzMNvhL9XTddXHA2wgPEat2UqxrGvfSqIBRd6ODiMAmLsr2AhBGbv5XADQSNb/Tb7QDeajfHuzbiMt1CPhUuaq2tJ+YhAnHHOFQStjZxtkk5l8pkD9zUjlwkjh8u4mgpjkaaHeeqbDAP8AQLThY9S3IsYlTzZMHizVu07CldD+IjjQ5Hc8jn28y0JPtyP/1UDgKPma4goNyHDi0J/Oilz3nk0lY00LixsE3UVNX3Ng5mDU8+Sf6SnSIw5d91f75OMVgqliYTw8LhfzEsmMj7HZlTEgcGeGJtuVCRs68yXSCQqA51abpnkpVDtXvEwl7XQztbzcqrYR+WuhvvBfTQpczWOoWF2iTIMKnV3YenIXCvI0YmyBc8gQqy52CYayYe4M87QxXCoQW9m095pKgtcV2Z/I6VtyxzkQi3DkqZi8V32XDNG9xpTkyKwTMW7+VnylNbCXDgTJoafFAThinWxkSn87HAwK0uEG1R9XIc+hj9useMMdnxE6No0gTDGMpviI1XKKYtm7KSQoKXMW5pUEhju8y4nx9kBZ5S/mHgTNwZS/Hr4PcKJknTnYV1+liAfAOKAX77N5B4RH7aGPJOKNnUQU/DoMxOILUmo9w/seTwa+Uw4fAsKD7jErBnxgsv1B7F9EFBGO3Ytc8idE0LGn3T2cQQpWk+PCS2w6U1GZJ5swVjTjeXAc5FeC5k= 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)(366016)(1800799024)(376014)(52116014)(38350700014)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?huIBGuR/1m4/wfqopHF0FTjNK3dZTz+ku70K+996pfkf3pXj4kwk8l/Dt1Ne?= =?us-ascii?Q?N4O2qAU4VdWwRuqDPZ26WAHItwYZcOLaErEF5BIls8+kj/lh1S3yE7yEi/VT?= =?us-ascii?Q?B1QtDRKkvVi2JnRjGo6P4NziPPUiNxjT4Z99P6hwkWWrPmh/gSJ9H6G59kWF?= =?us-ascii?Q?K0OYr8BOjPLAlwynUxec4ltW5ygoJ4CutgEIog+ZB41Kp4gFm2FoxUn6g4G6?= =?us-ascii?Q?Q9qOYZY/rCeLjglp5f+Qi2LtIuPsXBb/jAr1r/Y5xTSzXo0ZiSW4bW9VJVN8?= =?us-ascii?Q?L4HrkAiZ03sy5/jScpNDx8mc83uV9Apd9JWX+fVl0u7YPuhPQTX4PwrWPD1x?= =?us-ascii?Q?51JedCnOlElMoKRuyVJe6KVcQY53DAo4GDqiRAOf4LMtLIPM890Ew7A0pTQI?= =?us-ascii?Q?qkPHHCyhBnYH2BOZjIMsZt/IXmqE2e8Li45q3FsOP7M+cZ8UDewxt3BxBJwq?= =?us-ascii?Q?Jeb364EjGTxN52zSrLkof3DceYwEOqeTArTb0ZiaAw0rzBnE8XZI5ITWDWLX?= =?us-ascii?Q?JlnGJIGOfE1Z5pOqS6BPUnnQuBhPaurrP116VTX7hJOFYM3XWMA7j8xyMFL1?= =?us-ascii?Q?XU/KCIpSTAq6Wbs2fd6bbpusGJYolHWEmtEUkwKOFlvwF5m+RQKcXjZAMsfO?= =?us-ascii?Q?mu499ekaQKo+cgrSo76oGm1DBvg3bxap3ef19qPZ9UkK2e9cR3RHhaQ5YTHm?= =?us-ascii?Q?wnq4p2SkEVYRS+bAp2NjBZiJXtXfIQE1VIag1eszj1vSaqNphncQyzgzPFZ3?= =?us-ascii?Q?kVCnazl9A5LiQp3Iwzd/IHGf7blv7W18/KieU8ym57zOyjdfs1d6rbRv6Rcr?= =?us-ascii?Q?a5yjWyAOGCRP5uWw0R/bV8gCOTDq6qXMdaw7MhT+bpI46mqvC65aSZ7/9lNP?= =?us-ascii?Q?feYlp7vbKTZXCyNzR1zeUIL8yN3hSm92s9fTVEy82XZOWhyoSTu3Xx8f4o22?= =?us-ascii?Q?a6vvFyDB2301ZZ0tfcQlvtxa+bqmgo1Lx2XRhpzr0ih27Q0igA4Gk/cJgEFe?= =?us-ascii?Q?8Td4UJ4/oyZixl0T27VnAeSiqRgHNOc0og34KQo8sraUNpRmAntX2i7cpQt4?= =?us-ascii?Q?1Mxtka62K60NfSk55+rIKJGwxoN8zSKjwH/C+XjgddzTPLlFJ5Uvf00oe+wz?= =?us-ascii?Q?/ha167g02eXVsaK7sajiKHW2Xw0o2uQMQVv52xdeb/1BAylwYOzFyZ7Q4UWI?= =?us-ascii?Q?YxrUVIVql06HnxwENm9uR4v+51rmGcE3anWofJBQwa4tdAxYjADU7hWk0FK+?= =?us-ascii?Q?xblOIQ2ihoxmUR/yJjm/QBsTLO4wpRBO4b+da2wWfttDruTns+OwQUQMMGSA?= =?us-ascii?Q?YMqLWEMZqJ5vO7cgP1sLwZJPqFtUw0kLfcjabdB7iT/HUzYNxu7C5sdK8RlB?= =?us-ascii?Q?385wdVywFoI1o+/rrD76ChWGHzFZ1f6T14+DKZI1YYAo0c40IskVE3te+M1F?= =?us-ascii?Q?eqp+uKnY04sKCccUa7K9VqQTb7OZUUDJTI5ZbCy4j/5HmF0+8BOR3aETlLwi?= =?us-ascii?Q?sGTLTOrD6rHa773EdSHOvw6hSvyqPad2vZF40Nt7bSSmHOAjhQJNupZ7wSgP?= =?us-ascii?Q?ta7eSgBQ2yJqrE388239jAJBopxzVkzknVme5BLfRrexuOp9Z/yCv4U4/buu?= =?us-ascii?Q?SEWkVnvZdQuOXSYKgyuBdv0zLO3uIlG2iMBvMX+PgNizTsniuBEw3DTKqwQG?= =?us-ascii?Q?BNmii39+VSPGbX32GHeluto4w+nW02SHrdLLjBKl9lJw5XwEXtEcQTT+BCc8?= =?us-ascii?Q?pP0v11dh7asvnALhY0eliJMLQ4P8TkU=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: eb941d8f-dc75-4584-a961-08de89589dac X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Mar 2026 03:51:22.9985 (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: 2YqZ549BEkbriugRkJ4wl0TExP96lb6uM+7k8Q6TS8x/p+0JyfDIoVS0dUwoQtbx1rPXTY61FMdG4esGhExN5PMPzlh/vuqxpcrBhk94X2g= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY0PR0101MB4844 Content-Type: text/plain; charset="utf-8" Track the transmitted payload size per port and stop queueing more data once a bulk-out transfer reaches the device buffer threshold. Resume transmission when the device reports UPORT_EVENT_SEND_NEXT, and reset the TX flow-control state when the port is opened. This prevents the driver from queueing more TX data until the device reports that it is ready to accept the next transfer. Signed-off-by: Crescent Hsieh --- drivers/usb/serial/mxuport.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/usb/serial/mxuport.c b/drivers/usb/serial/mxuport.c index 034b506322c2..4d29a431cefd 100644 --- a/drivers/usb/serial/mxuport.c +++ b/drivers/usb/serial/mxuport.c @@ -179,6 +179,8 @@ =20 /* This structure holds all of the local port information */ struct mxuport_port { + u32 sent_payload; + u32 hold_reason; u8 mcr_state; /* Last MCR state */ u8 msr_state; /* Last MSR state */ struct mutex mutex; /* Protects mcr_state */ @@ -250,9 +252,13 @@ MODULE_DEVICE_TABLE(usb, mxuport_idtable); static int mxuport_prepare_write_buffer(struct usb_serial_port *port, void *dest, size_t size) { + struct mxuport_port *mxport =3D usb_get_serial_port_data(port); u8 *buf =3D dest; int count; =20 + if (mxport->hold_reason & MX_WAIT_FOR_SEND_NEXT) + return 0; + count =3D kfifo_out_locked(&port->write_fifo, buf + HEADER_SIZE, size - HEADER_SIZE, &port->lock); @@ -263,6 +269,13 @@ static int mxuport_prepare_write_buffer(struct usb_ser= ial_port *port, dev_dbg(&port->dev, "%s - size %zd count %d\n", __func__, size, count); =20 + mxport->sent_payload +=3D count; + + if (mxport->sent_payload >=3D port->bulk_out_size) { + mxport->hold_reason |=3D MX_WAIT_FOR_SEND_NEXT; + buf[0] |=3D 0x80; + } + return count + HEADER_SIZE; } =20 @@ -484,6 +497,9 @@ static void mxuport_lsr_event(struct usb_serial_port *p= ort, u8 buf[4]) static void mxuport_process_read_urb_event(struct usb_serial_port *port, u8 buf[4], u32 event) { + struct mxuport_port *mxport =3D usb_get_serial_port_data(port); + unsigned long flags; + dev_dbg(&port->dev, "%s - receive event : %04x\n", __func__, event); =20 switch (event) { @@ -492,6 +508,13 @@ static void mxuport_process_read_urb_event(struct usb_= serial_port *port, * Sent as part of the flow control on device buffers. * Not currently used. */ + if (mxport->hold_reason & MX_WAIT_FOR_SEND_NEXT) { + spin_lock_irqsave(&mxport->spinlock, flags); + mxport->hold_reason &=3D ~MX_WAIT_FOR_SEND_NEXT; + mxport->sent_payload =3D 0; + usb_serial_generic_write_start(port, GFP_ATOMIC); + spin_unlock_irqrestore(&mxport->spinlock, flags); + } break; case UPORT_EVENT_MSR: mxuport_msr_event(port, buf); @@ -1318,6 +1341,9 @@ static int mxuport_open(struct tty_struct *tty, struc= t usb_serial_port *port) * returns. */ mxport->msr_state =3D 0; + mxport->sent_payload =3D 0; + mxport->hold_reason =3D 0; + kfifo_reset(&port->write_fifo); =20 return err; } --=20 2.43.0 From nobody Fri Apr 3 16:03:50 2026 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11012022.outbound.protection.outlook.com [52.101.126.22]) (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 9AC7C3A1D02; Tue, 24 Mar 2026 03:51:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774324293; cv=fail; b=HBz+lYblurzppfcNHyTJxmrcK0b2328dUsGD9PPYPng6V2lDseO2rS1IX8ZJIrw1x0iGr5ispr1oA5zkO9UQKuHU3sLuDfLE9Wo4KT1XgVBU/lgrKrFVt064qG8HejQAlSKPSe29c3zR+jc0yympBARfrwWLqDzjr9YZEONjKjQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774324293; c=relaxed/simple; bh=tH+iXs8NSBMtleqRJjNWX0PSlg5sao7AvpDgdeIJR38=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=G7v8iT5eZb5kV+NwHSQkC4lgPeWHIPuhHgbFnMUDEweq5eHqO2kncOUhYEVc8gyUhUqzXdK8hyhSGrFk251TSdZyclnqAfUxiUTZ5nf7aSc0xiLjZBcSCciBNUXGmOyGqbzQnThowKd9KlxP3+cuwcx6ZqQUdoFHC5wNn9RHxng= 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=Zh27qy78; arc=fail smtp.client-ip=52.101.126.22 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="Zh27qy78" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=a0vfBSUhXarnfxkFSfikXeuoW5c7wJvIY+OQZ38NoCktGhX0Q5DdDbaRa6MYk2enesJDKrRXw5NHSt67kqY4HFoidX0xc0sgMl4xtx/m/4q9v8PaPyKCG3FZAhhk56mFTnqSKFeMWXcwmXT1VY7pGJMEvy2uh8hLRpOU9lmhJ9HxzAXVQklvnxIgyupboa+SukL0IigK8oo4hc9RdkrCASEkmEk4ugEliyVddWMROefG37bWrlmbnyyz6oSIRTVvNt3HZhPJH1RhNzEtfhzw7qbz8xXJmBJkxA28cEgKHOGCE3gJMc3vlksMS28FZEQIWkjafArC9L3ULUQyQoCtGQ== 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=m12oXJTDdhr0xx2a8llJiuAkple/3mPJux5zm1WOubE=; b=SqGxnydghDk5gqJJD+Gpkt0z70toUZGG+dlSOt+6pUhTKSZ+fYRgd/MrU7QuDi6Q4csf12g8wDLlOqsAxQQdsoeOkFf+QOdL/24QUriFjLsv454Dm/Aa+VETe0nea2hPwVpTUhg3Y9RiZWpDTqzgzpBa/LR1Nl+iedye8P7O/XCRgw1EF5hLGlH6aeS/MNLdrXUu63s00wfhpti4+Y88BFTR1FVH6XT2UzfmSwrR0/JxPznMAL3n0kh8hAc1WrBrKXRT1Mvxeq0GqHOMzPHWVjj6q2xbOVP3ivLh4iIOLGCLN+lx7WGcSDRV6jIPxwbqZZeW+X6kPk0bu6z8p1ChFg== 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=m12oXJTDdhr0xx2a8llJiuAkple/3mPJux5zm1WOubE=; b=Zh27qy78/GgypTZIb20LF6+ebHYWH4HB5Ak/bpkWJagfklAbMV+DzAs2JDJg9Mg8oBC7uX5BoatsXY1jrV7PkS9CL35Sf/ZOJxQJggKoIYqINYJbMttVyYm44Q3hN72OyBcg7Np/kj2j7F92cM7gktUtrZj7spMCDgidLUL5fYo= 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 KL1PR01MB5323.apcprd01.prod.exchangelabs.com (2603:1096:820:d2::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.31; Tue, 24 Mar 2026 03:51:01 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::ae38:e821:cf7d:3717]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::ae38:e821:cf7d:3717%4]) with mapi id 15.20.9723.018; Tue, 24 Mar 2026 03:51:28 +0000 From: Crescent Hsieh To: Greg Kroah-Hartman , Johan Hovold Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Crescent Hsieh Subject: [PATCH v1 3/4] usb: serial: mxuport: support serial interface mode configuration Date: Tue, 24 Mar 2026 11:50:40 +0800 Message-ID: <20260324035041.352190-4-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260324035041.352190-1-crescentcy.hsieh@moxa.com> References: <20260324035041.352190-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0023.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:a::7) 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_|KL1PR01MB5323:EE_ X-MS-Office365-Filtering-Correlation-Id: 29967731-669e-46d0-04bd-08de8958a0ea X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014|22082099003|56012099003|18002099003; X-Microsoft-Antispam-Message-Info: 8g9nizIK1SBV1YPf8gsK2B5PalLCGLWVLH1sHCqsZFGBa3yyRzxfKomhIHe376uSwuM2kzOPus+0gSwPqEnUVAPuX0IFvqA05X2xxVojCwUQ3h7inAqq2zYs2NC4UT9vriJ2JKCxF18sIp3gDlryhhMHRWO88mf/oI7Sv3GLHSnbGB+D+lxNa+xOFxfyPwwLeBbx8xwmVZLfK3rdSu5FFmmSl/u+zJ/BaonUxWeLB3o7PE89i7lPBsg1hBre5YG2ym8ZwNsvMioRCeKd+xGYhCjEW8JKR0YWJesUXHn7T09/3q1TFGuXQCDhTc3827ZrZcjNOZgr5Xd4zyk/90EnX1DhS45XA9Mxj6xdO+V9CbgrpzQq+Ncd+YcVCRDj83MqPWHrN2l0Fa6H/IwiKd9FUgjdiYqu7iZpJxoEh1xcz66L/P1uKu6LC24HIYjTBAUFQIzgWl510F9qniiAKKV4fmUUJhIMeOQ6qOLcpWXee8nF25cCeYmtLC8cLF2ZSP01g4GktxwnnaSaNAMFq1EGk1llhCSTGyZFpxvXWU3qy4ky+6mBYD6QiyYm7Y4fdR+PbTPKawTeROSwZJn7WenpRtRrBO4dnBtk9TM4PrMPlshq9PxR1v8LbaWpTG6OBFL5n/bcdWAo81K0+yAWWe2ZqAKwspnqHSrI+02hPjrI9OeewkK/t9n4+oHL4/vsDp3CIsPACBnXaX7KnWIHAQx1z492z8MXe85kOYN/NbXLkn35kJNt48lEI+y4LUCiKZ890lBLc7wI0dqmZuP6zaIIcAgHauz3MGm6/+LnyTobAIY= 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)(22082099003)(56012099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KBFq5xTbXVBASXmTM4N+pYEJCzgqBygd7p7okI+VVPPl6xKC2kv0jde6NkB8?= =?us-ascii?Q?D8EAsYPv3x2xkMvC1i59IA0Zfr2TWyK08W7RphT22ekvanCQn7PeidWeuJPi?= =?us-ascii?Q?Be105e4CKlHONnGJKTPq7PwQ33WcPCDtOr9XFXcAZLlVHdLwpIra1zRXktNx?= =?us-ascii?Q?OR+sHO8ahFZfJstlWX8XVLNj34xlowNS81iEiVcejMikZVcm/eWYVw7X3p8G?= =?us-ascii?Q?efxFs7ksC9jr6A3szoG6LPhhS1xCkpBOp+WSYfAfx0+/Osm+WmkUkkr5hqY3?= =?us-ascii?Q?UVMcOFJKp9Sj83s/8PgIim5DlhvHEt1Gf9xF8GccovwUQkyJWfZbrx0PUG78?= =?us-ascii?Q?yUMCO5UgyCsQn3fmB61j04yyA96g+L0lMbSuYu9aG065t86KCUCQDasktuqq?= =?us-ascii?Q?nKDh6eVR5gCiQoMiRAI2xyf8u1CynZEDcAYNoMyrx5/WERPVLjAASEZ2twnM?= =?us-ascii?Q?C+NqsUpMPmq0apk2t5/1+4/r26IqIxQNGKLQddYg+0a0t1N3RV99punt1Q3T?= =?us-ascii?Q?20pQUYGPW70gCv0hyIsgbC+DPLZ3YyYNLIHCuTFwGptyDEDPGzl3s99fmnDF?= =?us-ascii?Q?Ox4VxLf9XqRsikrYrM83GoC0zKIv+J+28Sn1RQ7cd6VcLAJ9HIu2ILo8/nb0?= =?us-ascii?Q?6+9IgldgVCR0m+yzZx58e6mPF3qwWA0gJZJHY2/9zIM91tPFnGhJAlUM7E06?= =?us-ascii?Q?gsqTi44Nl0oCLg4sCMBf9ztKNVzMlvBnromzmLR+uCPaR51OCXC0Nb/HTbPd?= =?us-ascii?Q?SKWa08uz0fCOix+hCqzFs024l2gunujayXm0btRPuojlt3wm2iKkKLVHa7s4?= =?us-ascii?Q?mIFnqwUIpoZl3SNddhxCangqlG+aw6q0DQL061QqpznznU2DgvAGwbbVxV+1?= =?us-ascii?Q?NMn75PRpQdBwmWP3STTN2YHVYkSRqGqLfw06aZnKS/7FyM5FVU+nlTNUfC8Z?= =?us-ascii?Q?s5dIh7gMNCJj3T+ictJInOXOElaU7WNtTSAw1qyDzB40yht7eKjngKXRdKh2?= =?us-ascii?Q?k+TQHzn8KG65i5qQSJgptRoE0GdRFgyuJX4xO+v9Cgho2esVaUyD38EdbD+e?= =?us-ascii?Q?5iy9CfgkapM4N0SzKBBoUR1Hepbp5x3E3abIbTg1Fvp6vpQH9rZ2afu304ii?= =?us-ascii?Q?5kL3hBm7oOdYE3hvIJmFCRIwXaBPk1dfUTNLYoIEykB+GhKjkoE42KRElinZ?= =?us-ascii?Q?42FxDJisPAQDildCx85oGN4sUCW6pT5YeAnxb98Q9+RTRPfHrqFJm6vGeCmd?= =?us-ascii?Q?pCH6BCVJi/UB1UGvQL90Bi18mu+OfKUndEM0VsrFd7M7sWR6MJYvEAC05rlA?= =?us-ascii?Q?Ma7nOCXTSQjh16rjR/X8bKexhQ336jo4Hf+QL/XVbA298QT1LNXIdwCSCrbt?= =?us-ascii?Q?j7BBbfsru8fMxLlaEpU+wveaxFXVTm0Yijqd8LT3qlvwTmc+7i27+yGmX9oy?= =?us-ascii?Q?okgvunbveuQ1inIQdX/kXL5DBGhB/fuGu8bD5TvSV/U/1CdPMXatFYYevhnH?= =?us-ascii?Q?m80wFtYsAaty9M07W9zvXojAg4QxnFDue/wk59I9U3HOROQv6oVeE/QnlEPD?= =?us-ascii?Q?3R0VYwP0NMWyyMmY9Z5lNsdBdCVyDtDzSJONYLsiQsTubD1txr7wWOnXy14v?= =?us-ascii?Q?Ev7TlAKzmGfI4nxEKH8GrLZ10O4wgJx3bcXzzEUrhwOrLrnyZflxyB3ovcGs?= =?us-ascii?Q?QWbMmYm8XBvwdIaas6BK8wvD+F1BLtJ7Nly8IxgAfJlkkMr1IhgWSSiZoFT/?= =?us-ascii?Q?gVqdIgYe/wg//nF9q/nRruYD404HnMw=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 29967731-669e-46d0-04bd-08de8958a0ea X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Mar 2026 03:51:28.4297 (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: QMDCaxRjvvjAc6ACupVnOzRVfIgFNW5ahcFS6Xzg7ElLTlKTofpNIduCSM1VlTnJmz8tLwvbzBbC72Q0vjR9xIOEBn/6sY2DzH9p1OWvhCA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: KL1PR01MB5323 Content-Type: text/plain; charset="utf-8" Add support for configuring the serial interface mode through TIOCSRS485 and TIOCGRS485 using struct serial_rs485. Sanitize the requested RS-485 settings and map them to the device interface modes before issuing the vendor command to the firmware. This allows userspace to switch between RS232, RS422, 2-wire RS485, and 4-wire RS485, and to query the current per-port configuration. Signed-off-by: Crescent Hsieh --- drivers/usb/serial/mxuport.c | 86 ++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/drivers/usb/serial/mxuport.c b/drivers/usb/serial/mxuport.c index 4d29a431cefd..9a8bb4f02da3 100644 --- a/drivers/usb/serial/mxuport.c +++ b/drivers/usb/serial/mxuport.c @@ -183,6 +183,7 @@ struct mxuport_port { u32 hold_reason; u8 mcr_state; /* Last MCR state */ u8 msr_state; /* Last MSR state */ + struct serial_rs485 rs485; struct mutex mutex; /* Protects mcr_state */ spinlock_t spinlock; /* Protects msr_state */ }; @@ -1348,6 +1349,90 @@ static int mxuport_open(struct tty_struct *tty, stru= ct usb_serial_port *port) return err; } =20 +static void mxuport_sanitize_serial_rs485(struct serial_rs485 *rs485) +{ + if (!(rs485->flags & SER_RS485_ENABLED)) { + memset(rs485, 0, sizeof(*rs485)); + return; + } + if (rs485->flags & SER_RS485_MODE_RS422) { + rs485->flags &=3D (SER_RS485_ENABLED | SER_RS485_MODE_RS422); + return; + } + rs485->flags &=3D (SER_RS485_ENABLED | SER_RS485_RX_DURING_TX); + + memset(rs485->padding, 0, sizeof(rs485->padding)); +} + +static int mxuport_rs485_config(struct usb_serial_port *port, + struct serial_rs485 *rs485) +{ + struct usb_serial *serial =3D port->serial; + u16 mode =3D MX_INT_RS232; + + if (rs485->flags & SER_RS485_ENABLED) { + if (rs485->flags & SER_RS485_MODE_RS422) + mode =3D MX_INT_RS422; + else if (rs485->flags & SER_RS485_RX_DURING_TX) + mode =3D MX_INT_4W_RS485; + else + mode =3D MX_INT_2W_RS485; + } + + return mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_INTERFACE, mode, + port->port_number); +} + +static int mxuport_get_rs485_config(struct usb_serial_port *port, + struct serial_rs485 __user *rs485) +{ + struct mxuport_port *mxport =3D usb_get_serial_port_data(port); + + if (copy_to_user(rs485, &mxport->rs485, sizeof(mxport->rs485))) + return -EFAULT; + + return 0; +} + +static int mxuport_set_rs485_config(struct usb_serial_port *port, + struct serial_rs485 __user *rs485_user) +{ + struct mxuport_port *mxport =3D usb_get_serial_port_data(port); + struct serial_rs485 rs485; + int ret; + + if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user))) + return -EFAULT; + + mxuport_sanitize_serial_rs485(&rs485); + + ret =3D mxuport_rs485_config(port, &rs485); + if (!ret) + mxport->rs485 =3D rs485; + + if (copy_to_user(rs485_user, &mxport->rs485, sizeof(mxport->rs485))) + return -EFAULT; + + return 0; +} + +static int mxuport_ioctl(struct tty_struct *tty, + unsigned int cmd, + unsigned long arg) +{ + struct usb_serial_port *port =3D tty->driver_data; + void __user *uarg =3D (void __user *)arg; + + switch (cmd) { + case TIOCGRS485: + return mxuport_get_rs485_config(port, uarg); + case TIOCSRS485: + return mxuport_set_rs485_config(port, uarg); + } + + return -ENOIOCTLCMD; +} + static void mxuport_close(struct usb_serial_port *port) { struct usb_serial *serial =3D port->serial; @@ -1421,6 +1506,7 @@ static struct usb_serial_driver mxuport_device =3D { .calc_num_ports =3D mxuport_calc_num_ports, .open =3D mxuport_open, .close =3D mxuport_close, + .ioctl =3D mxuport_ioctl, .set_termios =3D mxuport_set_termios, .break_ctl =3D mxuport_break_ctl, .tx_empty =3D mxuport_tx_empty, --=20 2.43.0 From nobody Fri Apr 3 16:03:50 2026 Received: from TYDPR03CU002.outbound.protection.outlook.com (mail-japaneastazon11013050.outbound.protection.outlook.com [52.101.127.50]) (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 07AF13A256C; Tue, 24 Mar 2026 03:51:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.127.50 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774324300; cv=fail; b=ApiBUNRfrxE+qJSmo24iWNQ1WIIwerEAiEWtJl5Icmn8ksameVNRtFxYWbiHH20louLZIiK/xevb6cm/smaeGCHoSjcsDVqRe0SZkZhpwo4QeS/Jtggquyj8cKejd1sbJ0HLno54Vm7JqIDEGAJvos1aM+G9iMbpmqFouuBYYg8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774324300; c=relaxed/simple; bh=UNwJQJ8CiBvgl6LPs9rD5KFtOezLWp6yxfSx82+GJK8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=rT7CCYcgSDE1MT7DwEAeBU93y947Xz0MCpDmc8YiDer5sa8hPCBGZSVfWDlOPKLzAMt8ekvKzXE9GV83Mx46xiY1q7yw6Bpdr47m1OEP9bY692pbk+0Tly3kRP0FnP1H7K0NQowlItCzMlwALJT3TyciILuSJibgnrs4OlZOUNQ= 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=fPDB4kXU; arc=fail smtp.client-ip=52.101.127.50 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="fPDB4kXU" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DSuk3KKtLIruZ37zLhuQ3tbZPWqxt7aZJPauRQnhSV6B3XLTNV+dpLSdPEOeDB+9ohJAzIgrufuLiTdL8YBuGvZpOnZHfSYZ8tVE0xu4nN4I+LXtU9R1yDp3CN/IAmEmegRlIlsn3trSKgvpiHAI6qFeAenhDjDBBQLG9OT/DETtrTRPD5Ja6z6CmjWtVbg0Imcsh6ANmg9k3kEPg/mW1kV6DdN+Dug28KS4xeF0ilsYzWWXXmJlxa2QMp9p8OZDvxOU0ZFVD74dVTaN15kob/9BrPJbfktHdzYVth/wHWcg3qzBml7B8p5XJsK54QdybcJvXDL6mNlpzhYn7/LtHA== 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=pmmXVStQEAbSs1RbYxlmBIxmD4cMQKNbpNNDaIAzv78=; b=nCaayVsPxpnavbZNpKDKQVsjiX6NFTyi0qvgaHQ2Pg8WTJwm7VdRQ0gmeGQzbsTt4/Urp1IOGp+Nv7dnxQU14X8Hc3zGHw1+qMTCzGo9FYJHl8NbKNCTbGh0s6FHJkaJlEvbUWGSlces9uBU8XjmVa07NR4hB1ApxfSoWI3ec+r8MUjTzNsy/J8AXU+BAMhYzykzCBF786XECYAm4YVYj5k3q8Y4n3TuV7PZoqlZsuv3JN2TT1wWD7Rg9Pf+4zoYMgAunoyVhBypKjubybBdLI5UQ5s800LpXkgJDnXvej/hmtZdcVqaE9TbuLDm/UPkOaUpqfQ54umGZzKJ+6R8HA== 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=pmmXVStQEAbSs1RbYxlmBIxmD4cMQKNbpNNDaIAzv78=; b=fPDB4kXU+KRrSRDibuXIPWJSvf+EnBA8IMCzDMAAVX88idp5/BR0ikkFjMRG8fYMc+3R+i76AZBawGsMMPDd3DX1CiFQYWaKbCMRLhZ2O9V03hIzcws4bdytMJyqv1qLCV7X1Zz7dO8Na+XgYkuRu4mhYPeZT3O1c4ENBUyDgIQ= 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 KL1PR01MB5323.apcprd01.prod.exchangelabs.com (2603:1096:820:d2::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.31; Tue, 24 Mar 2026 03:51:08 +0000 Received: from PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::ae38:e821:cf7d:3717]) by PUZPR01MB5405.apcprd01.prod.exchangelabs.com ([fe80::ae38:e821:cf7d:3717%4]) with mapi id 15.20.9723.018; Tue, 24 Mar 2026 03:51:36 +0000 From: Crescent Hsieh To: Greg Kroah-Hartman , Johan Hovold Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Crescent Hsieh Subject: [PATCH v1 4/4] usb: serial: mxuport: add sysfs control for UART FIFO Date: Tue, 24 Mar 2026 11:50:41 +0800 Message-ID: <20260324035041.352190-5-crescentcy.hsieh@moxa.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260324035041.352190-1-crescentcy.hsieh@moxa.com> References: <20260324035041.352190-1-crescentcy.hsieh@moxa.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TPYP295CA0023.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:a::7) 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_|KL1PR01MB5323:EE_ X-MS-Office365-Filtering-Correlation-Id: 55329a1f-0ca0-4e5a-bf9f-08de8958a5a0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014|22082099003|56012099003|18092099006|18002099003; X-Microsoft-Antispam-Message-Info: xbqkRQuvgfJzLrNZ/GyzgqgwqDw5zhZEywPRRH5Wh7nDmXDo3G2NEwxd9Dvbdg9w2Yh9igKBftb1VqcX3vnJrBE7mrT9th044AHtLrPp8N+B4galVxWOB1Vs/M3kwxAeAw+Crrd53bWjj1Rs6rVFpDlg8H5ZeQiZ93UnsCT9m0BmF6ugQQK3ObriTv1L6jhFQyVicuZkxlhy0Zw08iFTTa15+1BVw/yC0wmly5KThzTZAOJacRfQtrM89ROHrUmxf9KJK1VtN1TluaYXe0V9nbRXHkKK50ZASen3uuAIGH0C5CAdC2YgnUn9AKI5vi6YuIMRgGvHt//ElK4/vRHCjOUPbP5o76/5IY7RdSCphqO5GpWsaN9wMtpfNSmbOKIZlxWX7z7XYqN/CJKuod9dvHxYpNZzBPriyOhxDw2ZZpoR7MNHdoXxWZSB4KwnXgzSzW2+/ldBM/eXb6JR+8xBhloXdPFUnYRQjAUvkyJyiXM1J6TdXSbWm3Eiu/c8PiFeB1g3WgCJihwvSgjQZIfJDdcQzi7Jpar91SEigvvSm4Y04fqblsAjZAkyLscSpZsmBS0257WhVGElgptEME5gvbbHjXZYfCY6H6V+Hx6Isj30RQq+FB7MHR3o/YE6F/wwYlYeWL3ppEwQI0ll+0zT7Zrsrz+uCJ/eUig29/j33WGcFNiyJldOqnu+DMrR8LwaVxP8KBbYPOYiEKZjmCHY70IIwuisbfBFvPbuQ/Q1QPTq8TbfwTGJcNTCKWu6iiVFaXmdTDBrucUfXDiM2xQJJYAoLcOAdRUDj/LFXE7rv+w= 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)(22082099003)(56012099003)(18092099006)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?AAbOQhvuh5OVijF2mKIFk/Vsq1IRbCD/n2OREsMZR6mEpBCRZ+SY269rZ4W0?= =?us-ascii?Q?fx0fUuZsudSilJ7O5nYqiO+4a2xaazP1gZdpsZObk3xPOnoVdgjT2dq8UcXF?= =?us-ascii?Q?xPalL6Hkvg6WyslhM5JlqL0UAWnmbvFwNEBFHlxJJs1pCnOrSic+XsP7CzSh?= =?us-ascii?Q?uZXO/QFMJ/TYs3Ek7keUNaQkQHN1uP85goTXbr4rkn7yKotuKxwkCucEMlxz?= =?us-ascii?Q?JkgpysDejYxDZE5UwX5U7ThxTnaRL4ioouBpocMJOZF10KU9nPfNdS/ktqOi?= =?us-ascii?Q?2lUixyU/g/m7Er+dKTFgnwy/4eYRxsZemjMAMlEKUB6Pq/cZV7I9uZPVdDWc?= =?us-ascii?Q?M27ctKYC28z3NlZ/ZRIjNMLSFpiRbBhHmjvG5mQ6PGyigj/UGoro9pGe76ep?= =?us-ascii?Q?a9ksU4CU5JFnBJsBKrl+IpMUZwPxA0pKMmqyDiwLkKioez34ScSdSqHiASMf?= =?us-ascii?Q?yTx3sJJX9fJ/+65ng+hB3BPAbsxL+CSXnuoGWpXnJsEVoys+O4kibdnaVxOd?= =?us-ascii?Q?Y9IvxqqQSTeGE8hsNGCl6FqdciwaVRAvdxcL4aKROJvcitdJzMukUVGLDitC?= =?us-ascii?Q?zopkRXnwmpbZJoMZhUjtFGJUzOKL0Eey1pzd5cmKGmijyEF+HrKXeVmbe1xU?= =?us-ascii?Q?M/fcLd65/IcXS+qUvsmmHlhOY0nmHMxI9kOgqIBenDDjV2J521ntv6G6XkTg?= =?us-ascii?Q?mX/cT1o1JC12Y0Rb0OIqv+fktyRD0mMKXqumM/f4QTmucTHrGbz3bNGBnf6F?= =?us-ascii?Q?HKi4nq7YOo3VNoR3RB7miL6r8D32he6BGez+3CvQtMYFA+DNmUp5fkGGO4FH?= =?us-ascii?Q?Go0hm4GuDM0OOJECHTuS0XN/W4mfsNFFSK4qOx1Ag2DrY+Z5FUAop1OiDruK?= =?us-ascii?Q?S2CldsMBqQsS9hkbfiPxPZ1TF0Q+nC/6GNaDXlXgTqOBIEq4ytb+bktc68zU?= =?us-ascii?Q?yXCDMzAzPGHPuJNQP9FJKO8QgNuDVgVAHyTta+a8DtMCx9vM9Nvc6zeFpOf1?= =?us-ascii?Q?OjZdHGr8sI2mCMG5iJJvUuJp6krOXwkTE1VZqVcvW3vXBkzoRswCwRxY/k1K?= =?us-ascii?Q?1orWoHQWVt9g415AQRO1Gz54skQ1hGBi7lPKZVqLh3ByL6fXn0Cm2EvATxFh?= =?us-ascii?Q?zox2ERt7ZgTFEmqs3UIGm+6JikV0zw/lC/ihmza2hS2LRNucXRaTVEeRTxZn?= =?us-ascii?Q?A806EZ6BjXd8qyWJMqE2yG5BLM5Lx3uTvdRGB/HnWTV8ezLkYpXIMP2FBQdG?= =?us-ascii?Q?/POENhnMtTFpZ9QPiVe4sEr5pwcLuVt9q1021PdHdojENl7fy84oTfHLzCx7?= =?us-ascii?Q?oNTJMPKQhenKY1FTeg4fWafLcOvr2R8SB/MIGqNFNS2nLweYdfoQDCZAoFjZ?= =?us-ascii?Q?jEgpITZx3qhEy9tt8QmjwAvwjpLTtkJTZS3fYdoR6ZaNTepFsC70srOS39KI?= =?us-ascii?Q?f2LJFcGjn47pBFQx560cUkrCUXgeWZlNQ1hXj3X//LL/K+cJ8329ThTNTOa0?= =?us-ascii?Q?w12pvZVRTWi+qDLQ7riwTjKqoirJyYQGrJ9ZB/nxUckvtpwW8Up5amAZAHKM?= =?us-ascii?Q?DvjW/JrMtUagXvkzW71roy2bvzU3/RvSmAxrr3sHHk6ES7Q+TGh1/czGyoIj?= =?us-ascii?Q?/WPcwf7rIurE/alXLTon8rd32ozMNF7fiBzGYWo6JqjGNg0A3SLvJMomLHAm?= =?us-ascii?Q?xDb0Ku/kFr8C2/5lsyig0Aj9bOzCUxaIL3QiZEw3zzMSz7IRSe/VvTUKKA1k?= =?us-ascii?Q?d/8/poLoywOU5YPvl+QbSQwYZ5vgE/s=3D?= X-OriginatorOrg: moxa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 55329a1f-0ca0-4e5a-bf9f-08de8958a5a0 X-MS-Exchange-CrossTenant-AuthSource: PUZPR01MB5405.apcprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Mar 2026 03:51:36.3486 (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: 4pk02/6igB4EUsSqHWZgF+7+iQcZm/eT12HU6hEEIJ8e4m8wtrHwRO/ToX6ytT/jF46NbeTMrGO706LsUmzDYC8GsIi0Pai4QVqY8RRU+B0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: KL1PR01MB5323 Content-Type: text/plain; charset="utf-8" Add a per-port sysfs attribute, uart_fifo, to allow userspace to enable or disable the UART FIFO at runtime. Map the requested state to the RQ_VENDOR_SET_FIFO_DISABLE vendor command and track the current FIFO setting in the per-port private data. Initialize the FIFO state during port probe and remove the sysfs attribute when the port is released. Signed-off-by: Crescent Hsieh --- drivers/usb/serial/mxuport.c | 75 ++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/drivers/usb/serial/mxuport.c b/drivers/usb/serial/mxuport.c index 9a8bb4f02da3..24b86d1a31d4 100644 --- a/drivers/usb/serial/mxuport.c +++ b/drivers/usb/serial/mxuport.c @@ -183,6 +183,7 @@ struct mxuport_port { u32 hold_reason; u8 mcr_state; /* Last MCR state */ u8 msr_state; /* Last MSR state */ + bool fifo_enabled; struct serial_rs485 rs485; struct mutex mutex; /* Protects mcr_state */ spinlock_t spinlock; /* Protects msr_state */ @@ -1242,6 +1243,68 @@ static int mxuport_probe(struct usb_serial *serial, return err; } =20 +static ssize_t uart_fifo_show(struct device *dev, struct device_attribute = *attr, + char *buf) +{ + struct usb_serial_port *port =3D to_usb_serial_port(dev); + struct mxuport_port *mxport =3D usb_get_serial_port_data(port); + + if (mxport->fifo_enabled) + return sysfs_emit(buf, "enabled\n"); + + return sysfs_emit(buf, "disabled\n"); +} + +static ssize_t uart_fifo_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct usb_serial_port *port =3D to_usb_serial_port(dev); + struct mxuport_port *mxport =3D usb_get_serial_port_data(port); + struct usb_serial *serial =3D port->serial; + bool state; + int ret; + + if (!count) + return -EINVAL; + + ret =3D kstrtobool(buf, &state); + if (ret < 0) + return ret; + + if (state =3D=3D 1) { + ret =3D mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_FIFO_DISABLE, + 0, port->port_number); + if (ret) + return ret; + + mxport->fifo_enabled =3D true; + } else if (state =3D=3D 0) { + ret =3D mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_FIFO_DISABLE, + 1, port->port_number); + if (ret) + return ret; + + mxport->fifo_enabled =3D false; + } else { + return -EINVAL; + } + + return count; +} +static DEVICE_ATTR_RW(uart_fifo); + +static int mxuport_create_sysfs_attrs(struct usb_serial_port *port) +{ + return device_create_file(&port->dev, &dev_attr_uart_fifo); +} + +static int mxuport_remove_sysfs_attrs(struct usb_serial_port *port) +{ + device_remove_file(&port->dev, &dev_attr_uart_fifo); + + return 0; +} =20 static int mxuport_port_probe(struct usb_serial_port *port) { @@ -1266,18 +1329,29 @@ static int mxuport_port_probe(struct usb_serial_por= t *port) if (err) return err; =20 + mxport->fifo_enabled =3D true; + /* Set transmission mode (Hi-Performance) */ err =3D mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_HIGH_PERFOR, 0, port->port_number); if (err) return err; =20 + err =3D mxuport_create_sysfs_attrs(port); + if (err) + return err; + /* Set interface (RS-232) */ return mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_INTERFACE, MX_INT_RS232, port->port_number); } =20 +static void mxuport_port_remove(struct usb_serial_port *port) +{ + mxuport_remove_sysfs_attrs(port); +} + static int mxuport_attach(struct usb_serial *serial) { struct usb_serial_port *port0 =3D serial->port[0]; @@ -1501,6 +1575,7 @@ static struct usb_serial_driver mxuport_device =3D { .num_bulk_out =3D 1, .probe =3D mxuport_probe, .port_probe =3D mxuport_port_probe, + .port_remove =3D mxuport_port_remove, .attach =3D mxuport_attach, .release =3D mxuport_release, .calc_num_ports =3D mxuport_calc_num_ports, --=20 2.43.0