From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611517; cv=pass; d=zohomail.com; s=zohoarc; b=nl9w+wJd9GDSMPqCNd6I+8EDsNcF2pI7kWkK7QXArNIw/wC+1nkpHZ8GdPC9sCj0Se1NBh9hakRuyOQSNNu7rm8dBT0jo1VwmBoIxxsADLJCNg+kpuwrAGK27Fd43WOTUBVE4Kf6gtVJminDgGyartFEpK0HsP7WF5UoEJir17o= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611517; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=1J9hw3nrZMuGs8jMFjazW/vAJ+CqVwyt+EmnecSmrgw=; b=MtwyGW1ZdIV0eUWKD/bSFNQ4Axn4wLbHftg6jQkIwSu3CV9qGH53qGkDJY1BvNaYeEjT3p6txBUeY92JUrM3/adK+oxVzavG71/SDWUemxRjRZY0oT1xqQ6IkXgOjzKBqBlhbAXP8p0fKModV+wHT+jpGmhqzmKhoC+tgAuUPfs= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1793611517460126.35105441380881; Mon, 2 Nov 2026 01:25:17 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1467843.1676887 (Exim 4.92) (envelope-from ) id 1xNoHW-0003bw-T4; Mon, 02 Nov 2026 09:24:46 +0000 Received: by outflank-mailman (output) from mailman id 1467843.1676887; Mon, 02 Nov 2026 09:24:46 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoHW-0003bO-Ko; Mon, 02 Nov 2026 09:24:46 +0000 Received: by outflank-mailman (input) for mailman id 1467843; Mon, 02 Nov 2026 09:22:14 +0000 Received: from mx.expurgate.net ([194.145.224.20]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoF3-0003Nw-Re for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 09:22:13 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1xNoF3-0071n3-8F for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 10:22:13 +0100 Received: from [10.42.69.2] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 6ae8563b-8faa-0a2a0a5109dd-0a2a45029824-34 for ; Mon, 02 Nov 2026 10:22:13 +0100 Received: from [40.107.44.94] (helo=SEYPR02CU001.outbound.protection.outlook.com) by tlsNG-720697.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from ) id 6ae8563f-6ca4-0a2a45020019-286b2c5e28eb-4 for ; Mon, 02 Nov 2026 10:22:12 +0100 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5265.apcprd06.prod.outlook.com (2603:1096:4:1e4::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:04 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:04 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=aspeedtech.com header.i="@aspeedtech.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Gyjn4LB6+PdZtvqQNEOUdcBHK5wTtbHvJlOdRmJVquNlseQaaQWpjwWHf78Nyk9Ot2qnU2Ncy0XDUGrASoEMNo6r/Hb1jkMHm+FVKzDbXqR51tNdrLwJpxpWkVkdhXF2hLOKY1tSIark6S5k7+nH5tZ5gjaGTsvjekh6Z820cI5mNU8a+WawXfENSOJDSnfX5VjaCIkxLPNcPDIjcdvfT/L2rwB/AqwuqFBhO5mGQN+louEAGM4hjnt68Pe5Bjje8KOyH0SfuDbl5luE/+vnK5pYaYGr691Sk9LgetEQwy4z1pfqYL1BZvUQa7Om10E+QGgUc9niIcOL5AjH2jvBgQ== 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=1J9hw3nrZMuGs8jMFjazW/vAJ+CqVwyt+EmnecSmrgw=; b=abLL23A+1D9u4RGAkbd73j83KraWYBURQNSsjGbAddvy6pE00kScIGFLjYIurCgVkHGBK9lCFO1C9nsJQ4I+2KASOy8NHeWx1/5U9qO6a6BMpdP/kR+lgXXETKx1wqLmnGjH+Z5nM9JSHQcVKMX5UmuTGMW3SyDYPEf5snCdKnnXHjHR0Ahz23OwWrX+59ZtOOZ1R8e+XsSCEO7o0e4MDGrxMzz59PaUO3FOH0T4nytrQ5o3OMqazlXlBDRnZMQqvDjCgZ+Dp+C5ekzyl3ekvuR48859yM6eH/yWm5+BYiiYnZGkIG8q0WspQIqAx8D0vGNOiZJz+/uU2DvRfz/S+g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1J9hw3nrZMuGs8jMFjazW/vAJ+CqVwyt+EmnecSmrgw=; b=iBUPBSWC18cOS+WnFIYcfhlpg1QitVXNw80T8bDrQN6pEOZYEnuAOOm2sFDDqgyRL2C/9JG4nOmGjg4T5WcBA1AaXRFvgISvSUO10Uxx/C+357U4+3neCw6p33sndZKenbNsKxTyiH5YBkCKGMdrryTN/7WOb01Efj3Lh3LHyjHJE7OxFERXS9x3CEZf7VfWw5/s11MWenREnIYqWxZ9pnzVmZuwCV5ROZ6H5u7ZaHv95Kj41KkBiofNfayjVoIDFQaqHPitJLe/G7Ie1Bc+5GksdjPflY8ZGi+gBT55mwPLXUMneupu33VD2UNJ60scnOT5ob9qD8vvVvdI5fcJGw== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 01/18] hw/usb/bus: Add an auto-hub flag to the USB bus Thread-Topic: [PATCH v8 01/18] hw/usb/bus: Add an auto-hub flag to the USB bus Thread-Index: AQHdaqufLoPY3HwMvk6g+z4FKihsFg== Date: Mon, 2 Nov 2026 09:22:04 +0000 Message-ID: <20261102092201.1729245-2-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SI2PR06MB5265:EE_ x-ms-office365-filtering-correlation-id: 227b7a28-a186-40a4-1695-08df38c2c24d x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|23010399003|366016|10067099003|18002099003|22082099003|921020|38070700021|56012099006|261021123027099003|261021121427099003|261022105027099003|261026140227099003|261009223027099003|261028144727099003; x-microsoft-antispam-message-info: 0O/obyNDU2v73IbP/75EQlVLECLaWrJOIL6PL8uejeF4g34gkXh7y8zCcFCqH6Ds11T8oxZb8CVLTH8qcs4+ytM7NaJ0Ua6npDmbnGk7+LaK6UK7b6RCplu8BR9jRZqTYmLhsFfR/yO9ewTjbZm+q6J002RNwuqsNwfntPLlN2pWeOHlUqbEeYPD71Y9uGeOeStsXd+CZ4WbhlUG2Urmn35hFuXchDrzQlWyezTDZ7CA93gMSzZhXUdbN01l1N7N/1p7ZKPzOlIDJJRmxH1qkS2kwRRDWzePGdlW7zkmROM25Mw5rwRUNXBYaHmy8SZV7BIYUKUbXxQqsjbvZPrAxrrfuEt0VyWB8PmV9AGzqkEiTPUpY8fQGoeGa1Ay9nVRvFwbbdvwSxuZz5xdpUgyuj47wPsk64iGgkhSt69eyuYr7aNUAjX8QGSfpfmC7VAGczK0+LAMlVyE4rHJg4CRioxQYG2WVhlw6SmYgXRcMliYUO4GT0ztWRAGyDHKpyzFlxYxY57YgvnpZ6y5L+u36PXhbrz4t6HOBklMTTZ+rRfEJVpl9sITQcjhJeCnDPR8mt8KP5Ix0fl+S28dITIz3wCMVAa+B4H44WqoE4xE/Vt4afulbnu6wLupSk0qayxWEGmxgjJJ3d6GbE3SCe4/c14o2PNqDtNC1TSesEifr+uFxpVIgiGYatroSZFKh2/vZdQ/EnyBD9zGe2XZQjdvCfl3lxyLC3jg57so+f53VM0= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEZPR06MB7362.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(366016)(10067099003)(18002099003)(22082099003)(921020)(38070700021)(56012099006)(261021123027099003)(261021121427099003)(261022105027099003)(261026140227099003)(261009223027099003)(261028144727099003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?YAw2mZiHmdeu1t2tbeIx8gh8Z1P4A27dlF66VX32Vr7xtW8b6OsHwvGjXD?= =?iso-8859-1?Q?zR0nmXbAshMpo5/vG8qz0L+Q5pvazTGb3e7g+Adm0EXOg13EkDGc5dGOFh?= =?iso-8859-1?Q?XCKkJd4ar9Y0Lp6gyBctlt3vkgvedRAldtnNb1apqMX9vOuifGu4wLQRdm?= =?iso-8859-1?Q?LnT7/QhRhxWsfkULSWPCJaOL4FrUaQaXv/f53eeqocFXAD9pX/psZZ1UF3?= =?iso-8859-1?Q?pRAUSrOewCMitbR/VEI9uR25WBhW54pJvFpVqMZqzJR+hU1+qDyJSe2E6G?= =?iso-8859-1?Q?kYjWZdx+ttS8b/5Gn1DxcVyR+ghj8nTb0lJgxXt19ZhtsiIybHGJAxf8bd?= =?iso-8859-1?Q?vUmF9Q+f70xAWFZ5N+1QvZfnrbUxPTz/C55hm68wGXsiw29Xf+Znlbvy1S?= =?iso-8859-1?Q?fHbo+gw3F6TWm5Ce2hO1bEKlEiLWqnEF2IQO9KLmtPxcsQqPraulwI/M3o?= =?iso-8859-1?Q?GYZAODKIqNSHvR9aTiNTjtgOUU48nOkvj0o070xOGI7S7TLj9SNSSM+B2/?= =?iso-8859-1?Q?jquZrmzsyddJ3GRNT3FcjGsTl9eJCE0Hv8ZwWVfvozQvLyKNx6Z8dybu5y?= =?iso-8859-1?Q?BptG/mkq5Bsa66h2WSdbsoAw4JpvM3w98ZcRhmXBxE9nTvWwMh/TdAKzaP?= =?iso-8859-1?Q?T+jY/VdCruviPxkaJ5uTEVIynzVvQmmFaWsgxRSXybY8u2rEVxg53gf5m6?= =?iso-8859-1?Q?TaMYql4E2csIV0Rj0Z1X7vAfGnTRWhhzhrU2H5YxDPr8DuZGcK4NrE7D2r?= =?iso-8859-1?Q?6B4gq691ydTMGRTP4wStQl5s1Lpy/4AsCWxGSsQUvbb4RXhTvWOltfv332?= =?iso-8859-1?Q?S5p+xLk6yg/8jPKK0dqQ8npDiKNXrX7wE/HUfwdiyVEhYfhOlkDz6LLO55?= =?iso-8859-1?Q?e7LlIecXLWpP3epHA15bERTriYCzbDGD0jIDs4yEU3u5cHpCMZjiGiJL8t?= =?iso-8859-1?Q?3wVIw1T/9mXoiJiJ3BEQDcbqP2dcNT6Hprr0CIL+e452rqiTW7cpsdlInY?= =?iso-8859-1?Q?eH35udjE+Z9nqi3VI2in7LIg8iLZ+emK0S5erLyL3PKvoK2JTEtHTUnK88?= =?iso-8859-1?Q?pbcGWx04P2pGomZoGbgHjNUfEC4a4LZnT+wduzAjgS67M+SMZLUyNKID8I?= =?iso-8859-1?Q?Fcpkeci/8ouRR1HdHpxDZL9CjJWNauDCNdWMnOZlOHjVhMsEIvVraFUaz0?= =?iso-8859-1?Q?z5Axi3XvKkGgmkHrKxbz3iQdVx2X+zeqctTwqBvRqXDdszy2uRFFFU/HD0?= =?iso-8859-1?Q?sIrHxNDiXTYs9TWPolM4+UHNaX9/YSC8hcfB3P1BY5HzDDhIy73FhO1gT8?= =?iso-8859-1?Q?BvbYkWqBBs6Qqx/Wy3suqqYML8tTpwRsKvpSjX1a3Ht8o82hlkEVhfvnPp?= =?iso-8859-1?Q?hUaGPNQbuE9j6SAY8PLbZu/eeSp42/3XS19QN6JQkUnkMkff8HTjlWidMO?= =?iso-8859-1?Q?kFUM3Yqsa5b8BIxcQyRo6DXJ/2qoLYNl4qAdGSVThu4VLSsAXm+owbt8I3?= =?iso-8859-1?Q?2nzCgSGW6BoJMo1wrJ3Oqs2Byw0SuR3jzN+I/2g+QqFuoZcSXVeW3HN+J5?= =?iso-8859-1?Q?Y4ikKudwK4XNeHKVfnpp5HymbCk/wpVq6+xcH1Bz4G7hkF0luNq5SNbyNe?= =?iso-8859-1?Q?z8otUJ5ktEdbnGQum/mYg9xoqJXUX5V1Zr8ddTwUUv75NYZBnyGMK4hN6f?= =?iso-8859-1?Q?ZiPqt1EwKgLTYU2pKGhNAxytjZct7Om4RGW8+pAdK4mpnnsHGGB38w07Rq?= =?iso-8859-1?Q?apjkuhMy9sVE58ejCziIO5IRBHJji50PlviXlk8ywbrTBHLlqL/TLxrhkm?= =?iso-8859-1?Q?ph7K//+2gQ=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: YbcnIxKQKycce6RbQN+4KaX5VROZdTBnF4Zvykh19cMgjoLYovwgmCBmA8DWvnZrEnL4HHlPDczhBxudEfeP/kserASOFyKjvT93TejmoLWNr98ftHuX1HJwhOsvwYib1r1YbB+gu32uPqsGwzD4aMKPWBueUwTSOfPC2Uj95dCg5zNPFSQm/jP7jBtopYXFGnka9xVfGzyOwCe1meo4+pAXAr3emB+h0wEHEmUGocCtyoEsAPVAvAfmLBuNpQ4ROLA72CaJ4h2W9m7nvD+dxyJ4WwL+bh2JNfXlsP+/pv1kCjXtXVPAISErqAYnDxJYfgXUuATF1bMXLBpIVQ8PCg== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 227b7a28-a186-40a4-1695-08df38c2c24d X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:04.3647 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: E4z5nZvU28MJlOyVFWR/L7B8HUuZq1PcZximqRBzU4sIFZf/tcIso/aGcC7qY0r+15iNGbLyJEl+2oR5G/kbDlYYH+7XyN+S6OisOxJOulk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5265 X-purgate-ID: tlsNG-720697/1793611333-670B02AC-27513AD6/0/0 X-purgate-type: clean X-purgate-size: 1984 X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611519572154100 Content-Type: text/plain; charset="utf-8" usb_claim_port() plugs a usb-hub into the last free port, so that more devices fit. Every bus gets that today, and a controller cannot turn it off. Add auto_hub and have usb_claim_port() check it. usb_bus_new() turns it on. No functional change. Suggested-by: Gerd Hoffmann Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau --- include/hw/usb/usb.h | 1 + hw/usb/bus.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/include/hw/usb/usb.h b/include/hw/usb/usb.h index cbd4711933..cc1d6d74b1 100644 --- a/include/hw/usb/usb.h +++ b/include/hw/usb/usb.h @@ -484,6 +484,7 @@ struct USBBus { int busnr; int nfree; int nused; + bool auto_hub; QTAILQ_HEAD(, USBPort) free; QTAILQ_HEAD(, USBPort) used; QTAILQ_ENTRY(USBBus) next; diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 5cc5ffec33..92f67de4fe 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -92,6 +92,7 @@ void usb_bus_new(USBBus *bus, size_t bus_size, qbus_set_bus_hotplug_handler(BUS(bus)); bus->ops =3D ops; bus->busnr =3D next_usb_bus++; + bus->auto_hub =3D true; QTAILQ_INIT(&bus->free); QTAILQ_INIT(&bus->used); QTAILQ_INSERT_TAIL(&busses, bus, next); @@ -413,7 +414,8 @@ void usb_claim_port(USBDevice *dev, Error **errp) return; } } else { - if (bus->nfree =3D=3D 1 && strcmp(object_get_typename(OBJECT(dev))= , "usb-hub") !=3D 0) { + if (bus->nfree =3D=3D 1 && bus->auto_hub && + strcmp(object_get_typename(OBJECT(dev)), "usb-hub") !=3D 0) { /* Create a new hub and chain it on */ hub =3D USB_DEVICE(qdev_try_new("usb-hub")); if (hub) { --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611600; cv=pass; d=zohomail.com; s=zohoarc; b=jPETINCY62Ih8kwYDeLIwfaXnq+DCsOohmDqgLYSpS+NsWDV4p8vf2SSCiyvs0E+lHto7NTurHQma/4A9qV96cm5cY1TPZDgDzOXCnoQeAsHw1HMttRkMZknty+JoRG3WHEf24EpNzbI4ny3ifNEFn3O/+IlmaU9uqhtJi46SVs= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611600; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=DX9Bu5iUcluzz1IwNbqqdX2x3rrq6ZvYTGoWFsJ0rB8=; b=DbmrgBdMNqk2+OW41eVbXtIJESoNU5mTS8d2aUBvntL24HOQXrE5CGhLCC5gi1xvCi/alku+Id6G6sMZkXOAPs9j44qpcoeXwsdh6UqlTOCvBLRCk/5zEY7kmAS1y0IUxB0j31TvGp5+Mrv0cIxwecKII1xJUU5BRW3i2O1YbB4= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1793611599794127.37738115667412; Mon, 2 Nov 2026 01:26:39 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGE-0007WU-9f; Mon, 02 Nov 2026 04:23:26 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFK-0007LE-KD; Mon, 02 Nov 2026 04:22:33 -0500 Received: from mail-koreacentralazlp170130006.outbound.protection.outlook.com ([2a01:111:f403:c40f::6] helo=SEYPR02CU001.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFJ-0000W7-32; Mon, 02 Nov 2026 04:22:30 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5265.apcprd06.prod.outlook.com (2603:1096:4:1e4::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:06 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:05 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hjx/b7ZkOY7jcsUD3VMnC1vAhlhOrp6gdKSdJmZ4sdfCKGL0Bh3f4sCtbwCo9BaVpZdNu40I3a/lUS3YXlrBMJJzqIFZj+uAUL8Of6Ln08tg5kW0V8vkZwKDJrhW0i576d4SdZKv0txDnPjGnGyCLc2pV/DqFhhmjlzlFZvhSIqiHfCOR+hVFTlMRVn4omH8P2IMiUUZVPN4K66iyKxbGibkUL+4snj/Cd/Kcc+sA3EifGlh3WwJcu3UdaVFQ1U9tgTPySOUtwTz9ur1scCaehZuZavIlG1tTx1xFBWSUXi9TmVFUI2W93EieLJ5r5a77e1LXc7/OrzQyLeL6h7A0A== 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=DX9Bu5iUcluzz1IwNbqqdX2x3rrq6ZvYTGoWFsJ0rB8=; b=TtGzs64+llQOq3kH/z243omwQv6jzfFpTUvcLBOckwN3AhrqHqwOfM2S5VsX1IKC/Luy5FowII5Yo4LpkzQvSLuookHxDDALOYY9khI7EsSQVAAwqxZ7rzeUAUHNbMdYFTQ7y0nLzXHYGOM0/RVLQJ3SItD/1rQ1pemIX82FNKU4N0vMD8duuuDWPFiNjhcYNDlJr87/mYRS+lHTl9yzyNYwHEmORGzNkdZHV600CyvsSDMp/GFnSlUCaWNjrF8khYIcdcEOmfQoi6tieVCwViM6pRa590qDyFKn77s9YRi8nfCmSb4d0yET/F+4ss8f3JGelPQD53s7GgZi6zCGVw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DX9Bu5iUcluzz1IwNbqqdX2x3rrq6ZvYTGoWFsJ0rB8=; b=iNv/6b0VSTbzyUmjbhSALDOvOEzbmIx+DhiQXTlqtbv54wXCrOW717+tZf4bvUzc1/fhIaH60inpBQMKC7Zwc4tHSfXFFaaMJR0S3eXRBAlhf75n3PMUK2GRaBZK4+I7yMhXNu1da2Vgif8dfLEMfX/gvNCeAHGHrfyiMJW6wBRKUIAXvS8Piie4D8WJH6NsssHyBCdUNgIzapuOPVprxFm4z686gvc2FIJghjCnnm/vaDR7mIUAEOHxE5jjg+uJh37l98EnR70UP5xZH5eLwyU+Urxcw+TDsqyKYGnZ8ZwBOYdUqRNThncXlS83E4slx/qqCo6HrmK/ILdQq+ZjNA== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 02/18] hw/usb/hcd-xhci: Add an auto-hub property and leave it off Thread-Topic: [PATCH v8 02/18] hw/usb/hcd-xhci: Add an auto-hub property and leave it off Thread-Index: AQHdaqugzonZbCOsyEq5GblPuZWDag== Date: Mon, 2 Nov 2026 09:22:05 +0000 Message-ID: <20261102092201.1729245-3-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SI2PR06MB5265:EE_ x-ms-office365-filtering-correlation-id: 2d6ec937-2625-4464-37ab-08df38c2c325 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|7416014|1800799024|23010399003|366016|10067099003|18002099003|22082099003|921020|38070700021|56012099006|261021121427099003|261022105027099003|261026140227099003|261026121527099003|261009223027099003|261028144727099003; x-microsoft-antispam-message-info: kRWFjeDMcxv0jMuXmpMHLnnynSRQWnTws00M51ITlck2EWF9Lko6aW/QfbyWCwBIsA9MB3qq0HjTmfCojNRXWGrVbBOqeI1GPap0QslNIhPO05yyu6Dnlsr3V/ZQUyCVVjxKOk5p7EZ8KE7p081G8ydcEGeqA0l/GZP0Tg/1hXwEPxbVlQzwTVDNXQKAEpLd/scdvQvKPes5dQEgdtn2fV/qxtba0Tdj8HP0vLMdfffPEzs25hsP8ItaOBK8dZ5+scxxWqEyKDkO7CE/fTNtl/Wjy+XDPl/UvjL6xuJ+lUuHYgfqP1qJKT9ZWNEDevW4EOnJMnjZI2rjch93M8lfW4U8BQkfNCFzTOVSxuucvwxwWeCPnmi60NSnDeEO+SOio0vfmXaQANCg/QiP90VQ3MleXp2XQecwVTms507WQeK+MFQbLR2wBvHBlXlPt88f2b1JpJvICk0lHNyr3S+XmEGuc41T1IGjZRuNO5nLIqCzgBrtQrJktdlNuWft5MK1tq1Vr5osjBipYPjxDzBQ56+LfY9YmcZJBOkh1SFPFnSG8pZVFB9XFa6zYPS52XN+l9PdqlDibZBgOWpJQP2sgJLuE+pWk7UOB2VAvqFWf6DcQ2GztjnXLq+v87AaixQToAbDJ3MQ2PnSy8H+rUv0CrR2nnZtopCxKrTwiB3bqCYQKsWeML9nzXqGSjVwlFsbJSc1XMZ+SHzIwdyjNF5ZNH6wD7Tlm5YHgjlFI0aox/smTAxLRzXnyB8bzgvLX0aA x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(366016)(10067099003)(18002099003)(22082099003)(921020)(38070700021)(56012099006)(261021121427099003)(261022105027099003)(261026140227099003)(261026121527099003)(261009223027099003)(261028144727099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?cWkPFXBUrn2VTilTuRkTdk/l5GqnSrmMDTMP6bvGn+REAq9JS+70oygBn9?= =?iso-8859-1?Q?qUz23QCIrcruU9n28LNOGI2Tqf4Qgicui8nNGIO25bGYNngcvpufTFqX1D?= =?iso-8859-1?Q?cjSYSb8rSpKOKVRHj/DobdQJpGA9Rsu7f9TAuqDWHSt0AUFaIXTVIAXuaf?= =?iso-8859-1?Q?/IiSc3JE2niqzlQ3+xlDgt9BUjDOKgXFxLVEt3S1HncbeH/jGC5ToU86Ht?= =?iso-8859-1?Q?9g6gEOT+noGg70yTFKGc4vE88U/I+A0r7x/SM5PISXiuPrO1qfDlXWSYet?= =?iso-8859-1?Q?pgJWl/SVkbJehjrTnwB+VPOSnUDmNxJuQwU+RbxeFIM4jVioRJo9zadON6?= =?iso-8859-1?Q?TCwwEawzTBnojVbf2wj9NjXSmXKlp2xazvKsowifaZScEWaRLeBM8AgOgY?= =?iso-8859-1?Q?l/wwWB2OFqUZrP5nRnPBrzHEkJQ/gRkIZukS9gPgb6AEpsyPHZPN0T7eMz?= =?iso-8859-1?Q?/bcxipBLPEwQv8oRHDiAU4tqUpl49q2G550WEUPgKPidVvMY3jfaA6wyro?= =?iso-8859-1?Q?db30nrHCVbOPygNlaWzBI0imiiBgC0LdikQV2jHSsDunAfU0LuoRM1yPRo?= =?iso-8859-1?Q?psKKCZyG0iYmGcehlF/teM6VVWSNWvDKPu2q2wqwG2Taw1zIajJE2PfSfY?= =?iso-8859-1?Q?yGZGeCiKTrCr3mqn46sGQRZxewBddlpBTvY6xL42aFe76uvATMGVS38E9m?= =?iso-8859-1?Q?lE4/bnMXBU9o7EtCcoaIvSWrTJhGALN/bXYqbq/gZPVmVG1CpWq0VVSg0L?= =?iso-8859-1?Q?nEDbj5tkRnb1G/tymnQ7C6hFuTJEYQQk5KWVnXLrq3v7eTA8m0G5Qf6qdn?= =?iso-8859-1?Q?vfZEceNhelsplDu6qr7FPftvLEYeE5Gr1xaITMoVfQIKm8O91/3NXovMJX?= =?iso-8859-1?Q?0616VDtQjWAUIoBBTyJ2OomgjhLceQqEi83WT6CKXN722AFQXh8TXKH4hd?= =?iso-8859-1?Q?LmWFNQzsdGnZJb/9iAFKIbzC51Ck8Gcwz6J+G0GQQWOAUkqgsjgzdvQCbu?= =?iso-8859-1?Q?dKAufrnsce261v7z8RZvxvU3A8OChvsDz9nJbi1Hrgqdj1MoIyyAk9Zb0J?= =?iso-8859-1?Q?6MJZmETch8qN3kgrZhoHxAglvjtHhWQiu+/4hwwb7TEinSkJvkOB3fFFtv?= =?iso-8859-1?Q?WBZ6H2KDsA5z5WxLmZrQY7tV1lVdMg/HN730PCfRM35A1S2oL4dvelm5xl?= =?iso-8859-1?Q?4eptTWOCsz1+iehrul9mpxsusoD/UV1MoTAY7m/qduOUUC1kwRFQpE3Nuw?= =?iso-8859-1?Q?md6AD0EpTdRsBZZTwjkPOlcizOJsnEdnxdtXRH+N+3XCwpPv+3dBvQKEHO?= =?iso-8859-1?Q?IJA6ZUjnUHFLYYDUbJudGVZy3GRWfxB5EOvf9XqC+G0wlRMFVp2dD6MuRn?= =?iso-8859-1?Q?UxYhiA1yZhKMhfoZBjQgZiquq3F4x3eO87NX2/2m1/FcNU7TpNJ02Auky9?= =?iso-8859-1?Q?5IMqJV+kpgqTDCic7N+1fqnn9lNhDFxi/wl5XyDrCwziKSen+WlAIfez1+?= =?iso-8859-1?Q?O81h4Dp+ZbneiUduWIBLx20N6djHx/R+veh0M+u8Ayy6ucu5bSyfWzsWeT?= =?iso-8859-1?Q?lv4pZWLXERukiEO4VsYbtM5leD2j8/IF/sKQfUr/gAXcVNTF1YnGUzdn9V?= =?iso-8859-1?Q?c52qk4MohvVQCMGku14mwFuKpZV3j54rmPNz+kHnWMEoEoI7rcoDDPKtS3?= =?iso-8859-1?Q?w3tTR2IzlG7OnDgEuVm9QJeTiXwpVMtpt0AVxPbmHSNSOO8j4dpCwKpOSH?= =?iso-8859-1?Q?mB1y8TDs87srTK4Ttk/qI6ha2OC7MP4i1h5TUk69H058dBnvzGIul2G26w?= =?iso-8859-1?Q?esrMSBZiVA=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: p3IQ89Atc4rbIhOmeCBHoKP+gIaHDMzpiaCyLFMZdstyqT0e/hanFh+GYU/506CGx/xMkpWerNAg+0voiee0q4uJQtXJha12Ai0LbsCcrNBDtKDnqWYHQzt0iIjy3aDdm9HLh/lfrInzbcgKGX5UW1hAR8VpLaGkEDhY3XL7ozLB/UezCON8Q8p91JUe6RrCCZBDpvxCg8FZaoeGRnss+xkSLEVw4SX+eCA8cmWQBxjpa8U05XJl1SP7FGeVl9nRNblSNqUESwoLmavcSEqhi0x79P41Ivm44ZVFkCs69aiXqWE6uVWsCr14ScunefKhI5jFZUkaUwZra3bGN4sBOQ== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2d6ec937-2625-4464-37ab-08df38c2c325 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:05.8411 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Dh2SfPW7gBFu02TycU1M7fnbrY0nn+Y1egDAWfjagvjbTGQw9sRSRcpJ3W8RNZEKo/Hag/Lwd3MAMZ+cRHiJBwAGPKQEtq1QijBMb/VCa8I= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5265 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c40f::6; envelope-from=jamin_lin@aspeedtech.com; helo=SEYPR02CU001.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611601986158500 Content-Type: text/plain; charset="utf-8" xHCI has up to 15 root ports and does not need a hub to fit more devices. Add auto-hub and leave it off. hw_compat_11_1 turns it on, so an older machine type keeps the hub it has today and a guest saved by an older QEMU still loads. Suggested-by: Gerd Hoffmann Reported-by: Junjie Cao Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/usb/hcd-xhci.h | 1 + hw/core/machine.c | 1 + hw/usb/hcd-xhci.c | 2 ++ 3 files changed, 4 insertions(+) diff --git a/hw/usb/hcd-xhci.h b/hw/usb/hcd-xhci.h index 5cb9e06d1d..a3eaf2ebb6 100644 --- a/hw/usb/hcd-xhci.h +++ b/hw/usb/hcd-xhci.h @@ -191,6 +191,7 @@ typedef struct XHCIState { uint32_t numslots; uint32_t flags; uint32_t max_pstreams_mask; + bool auto_hub; void (*intr_update)(XHCIState *s, int n, bool enable); bool (*intr_raise)(XHCIState *s, int n, bool level); /* diff --git a/hw/core/machine.c b/hw/core/machine.c index d9ac4b419a..f8f5b01117 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -43,6 +43,7 @@ GlobalProperty hw_compat_11_1[] =3D { { "sysbus-ehci-usb", "x-migrate-fetch-addr-64bit", "off" }, { "pci-ehci-usb", "x-migrate-fetch-addr-64bit", "off" }, + { "base-xhci", "auto-hub", "on" }, }; const size_t hw_compat_11_1_len =3D G_N_ELEMENTS(hw_compat_11_1); =20 diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 376bc00264..1e42c851b4 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -3377,6 +3377,7 @@ static void usb_xhci_init(XHCIState *xhci) xhci->numports =3D xhci->numports_2 + xhci->numports_3; =20 usb_bus_new(&xhci->bus, sizeof(xhci->bus), &xhci_bus_ops, xhci->hostOp= aque); + xhci->bus.auto_hub =3D xhci->auto_hub; =20 for (i =3D 0; i < usbports; i++) { speedmask =3D 0; @@ -3660,6 +3661,7 @@ static const Property xhci_properties[] =3D { DEFINE_PROP_UINT32("p3", XHCIState, numports_3, 4), DEFINE_PROP_LINK("host", XHCIState, hostOpaque, TYPE_DEVICE, DeviceState *), + DEFINE_PROP_BOOL("auto-hub", XHCIState, auto_hub, false), }; =20 static void xhci_class_init(ObjectClass *klass, const void *data) --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611481; cv=pass; d=zohomail.com; s=zohoarc; b=Ib/oD/Zo6p563QKOMeYhof/ztisLyItvM1/qZVa6KN/q/ijK5JF+4lVE7nDhhYkKot2qmJtwJ68ICKIF6G9jpIn0e5JTBYuwcPl5ejxt8o+BDhHmGU4QbunUaZbX+5xQ5sH2SQNTFfnKls1uj+K3GMwhR4gNMNjtfCxg8AaZwy4= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611481; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Gq/0xTQzt4r4qACD3SKq9qG7f3wnpPsxLchH1uuagd8=; b=c3AomgFbPhBMWSjnyUJsL2TVSxhHJe5YfHIEuhHWJDtIH0m/g2sh7pNUJsEap2mMCXsvlusKdXjeSBR4XVpBJPHwUcA2fNSnL9SQmDIFFRfJihH/tt06JQxVkhguZaWLLpDZQtK43zztTezvvV2Y70X0M4nxQe7qB+0yoY8eHyQ= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1793611478976439.59546079505117; Mon, 2 Nov 2026 01:24:38 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoG1-0007RU-VC; Mon, 02 Nov 2026 04:23:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFD-0007JH-Jl; Mon, 02 Nov 2026 04:22:24 -0500 Received: from mail-japaneastazlp170130007.outbound.protection.outlook.com ([2a01:111:f403:c405::7] helo=TYDPR03CU002.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFB-0000WI-2Y; Mon, 02 Nov 2026 04:22:23 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SE2PPF4565C7005.apcprd06.prod.outlook.com (2603:1096:108:1::7cf) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.6; Mon, 2 Nov 2026 09:22:08 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:07 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=L8Vi98TCqip7N31hxV8+V59HTn7yaT19B3tRHbnd93ctmY73Z3eLhI1eUprm6vwfK03SwfcJAblHOohavQp2fdOkW+o093BnF79LwOmAgmfyl+TJC+ZaLl/aaKyGPps/HiDWlFdaOecjYKFwPSbs1k0DojifNpbgVUb+wu+zncrOFTLVzbYKa+LulP+NDUgx9rJa2DqWwtJ6VVIHsVmHcYUN6qkZ33tTvyDkAiRpSl4PZYpDckPZGHVSNi+HjFrXBLzBAU0LZxCXnbCf81KbNnQJ6Ig0VCNhC5H1O3Jb/qQJ5TBYwgGqulqA8YOqVPSCjvzMt0nQYCTWYfWvhFhQzQ== 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=Gq/0xTQzt4r4qACD3SKq9qG7f3wnpPsxLchH1uuagd8=; b=KJcWLPU4J+P/wRNsfFzbvjSniv3vKWILphZAICpA29BJ5Aphi0hcW86k4q1lIFVkI9PkRyRZc9gS5JXJkVXox6p/4xFANmkAS7Id/VHtc61EFDKqTfCsGHPjgVk3njcMvxOoO4h2d2gBgO0wf4S6M6c/Ipilxs+v7rZTYvqEyNiBzhywG37ho5248q70XvtmJ4epyVAf/1peGbSRqnqTFc8qXom8s9AOQeo9kDCaJ6VcBo8bd7YfES+mFGjMmEq51dt15Se6embpmphUuM4H0kahNNsrTQoXHwT5YuFCM6gDzO73QIkoKnJMT/PLDyfCSOdWhtjXDuN6gejHSotGXg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Gq/0xTQzt4r4qACD3SKq9qG7f3wnpPsxLchH1uuagd8=; b=fO3gELXebgs/DmfeJDsb7Br7VwQZTfjha/e8YPGYiHZ7depdtCKig+QLDyn6ZU5H/Ijifw4NBdTM6bs83KMcTWBZENWVaBB3tfFwvXW2i7xGfWKx1rdnC0t6AdlRtE2jctPid06lTYQBohqFUqizgQuRVNCwY+1u5cPaKhwjp+oZWJB7BL38BKLzkqsTzkllg+z0SlJEB+KDUqyWVocCAc2wPM1c0iW4e4Slt/4yeWuwUrAjIoRHwAF7/OHRA3LuwEocPfJx5suvTszGt71t4jlBPdjwZsGa+JePBTLhGJ5aH4Hw5rWnnSahIfsBT4SWUlMUkTzDDIS6yXYDSmGTWg== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 03/18] hw/usb/hcd-ehci: Add an auto-hub property and leave it off Thread-Topic: [PATCH v8 03/18] hw/usb/hcd-ehci: Add an auto-hub property and leave it off Thread-Index: AQHdaquhga6t5nVRcEGa+nf3TCiRHQ== Date: Mon, 2 Nov 2026 09:22:07 +0000 Message-ID: <20261102092201.1729245-4-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SE2PPF4565C7005:EE_ x-ms-office365-filtering-correlation-id: 8d3a3f8f-560d-4e3c-10ed-08df38c2c404 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|1800799024|7416014|23010399003|376014|366016|921020|38070700021|261021121427099003|261021123027099003|261009223027099003|56012099006|261022113327099003|10067099003|22082099003|18002099003; x-microsoft-antispam-message-info: XepseZPBYtKEWGKlREqSDeQB39eMv6vPozkcgHzK7teyKVFyjUazJvJKtECcGggWI0ciBL7pEGEdw1iRb0Fk1hR5Ow0u/LZYn6KPhz2e4CO6bJ7qiR70HpNbkd1nl/6NIbaBp8nSJFZ2SICYxlWNpp/3yP+fEOcVd6k797ULsgtUlKQbm4r3He6xdfWvJpxSxAJui0BRW7LpzH0NeRQ0oSvvusi6o7GGz4FJ0idhv2s2Xy7+HsFzdMyybkK85CyaIe+3SizoDBhN45JB9Vub1B8sgPcjPkJWlpw78Qo2uaZF8stmsb1JRxw9v6maKtdic901Drm2UAbYSWVpEfKD5fOuOYSHGmx2Or32FsuLkKIvoB3Jazrzf1BPaq5Ps/lSqURz9JqEKSe+gGkn9zL44dXa46+W5RxuqVjNX+hi3kwzPthR0BEQIkqtiqWO3HDdVGnVB3G8PTfKuFwaAy263MZ4eJZuUH9x6uQRu/RACeDJXi/o8ledTRLn5gTl3ps6hRMk84UAG7Y5JT62hIVoNt4LEkyyPCHnvPxKvn4P/zLMJjptYOIcMpFyu1Wd7jKNhxueKRc4rfhmod1ELsDROE+49jZu+rKDyzQInXSNxSeIiMSPe0InT6Ht8mCbFLbPyJxLdJHPo0QTsE89T6jWrt8IR2ykqfMclN3klUxPavoV9YOyQnlTg3GpPGd9BY6kmuTDDC4UTCSGOSiFhnbpbxDnOu8zprAiTe/vqXPNi+k0M/vMRBA9Ly09+F0EsXAr x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(7416014)(23010399003)(376014)(366016)(921020)(38070700021)(261021121427099003)(261021123027099003)(261009223027099003)(56012099006)(261022113327099003)(10067099003)(22082099003)(18002099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?Heo+qSmxRfLp6eUorv/e2YuYFMY+BjnujU0HbRfeu+331YM06HhmwsdqHy?= =?iso-8859-1?Q?6mw6VzcAXpQzU44dHrPMm3iiOZmtapdly0YUWNvoAVk/m/RxwV06/1Ns+k?= =?iso-8859-1?Q?SsSguDLHGbTkgDbLw1EfRO9p3ixV9Mv4iS2CD9vhqQt6ealjjNV3sZrXik?= =?iso-8859-1?Q?mrEWCKgcHjUkqOWCcMDBVuz9DBKc62gJXadUW7MJbVQxRWW+SwDs9shFZK?= =?iso-8859-1?Q?w1cOWwQ63E0ZzW5J59yPPvri6wQIwoSqh6O4ap9Huug/9S+EibKfvXVHTh?= =?iso-8859-1?Q?TJraQAakDZJtnrqqj7GjxZWnlYWR1LXR/4ib/sxWqEBX8Evya07v4MuWFb?= =?iso-8859-1?Q?fZ2jr+fEQlnHINIbaMujZTNoHZU5RVB/Iu4HtaX7q2E35OrHOAMgMe8u31?= =?iso-8859-1?Q?Tpd84Jj7N1Mke+F1LmjfwlCOt8zVgQp8SBJzKgqAJ3AvOpy2qlbRbADO9h?= =?iso-8859-1?Q?4oTmDs9G7z59lEZC8zRUwz7XuKEc2/T7oH5a3z3ckOMJXowp7mVYoqFP29?= =?iso-8859-1?Q?IpzvjQgVP1Q6uPw+C4S4KASVAcQPXdXN8F7WlfrtrcO8vUSpXku4Gpr44l?= =?iso-8859-1?Q?XS5k+j1TP2WuTDn54D+m3DrLr2RuyDjuxtyaLUxAf1Fpb/Gp8Ut+3rPwLj?= =?iso-8859-1?Q?lWsZ5wtLSOfvqKRmfgfhjnCP/Mix+IWcn31uDmgPjOUzXYvOcwIQpoQm/W?= =?iso-8859-1?Q?r+2vl/IjLxc33hVJMg8yFZq9SPijKrAJcV7OjKADVqG4tDbC2N0vBVgaVQ?= =?iso-8859-1?Q?fGaXM7Xh8a52natRlp/F1b/vgvx2Hz1qXl4gy9IHTzrmH2WhUZCI+xATry?= =?iso-8859-1?Q?rDyfdkbCqKmGS7STTIg3OOKDaindk01uk72/Bfz6HjPVRAAxpMG8b7HI2L?= =?iso-8859-1?Q?2pB9X7DRpHYpG5EQSdanmNkeTZck529XkXStRMtbgPjodk8XUx7sN2boW2?= =?iso-8859-1?Q?ehh9nSrJwvnVa52TDjRwiqnU8DTqjc2szcn0IHGB1dbJmrRPSMbXvhBfk6?= =?iso-8859-1?Q?rdQfR7PzPsMNnN785I0OOrWrqXYb6xTRlnghSCPNvcKoD4PWfr1tIIbnFZ?= =?iso-8859-1?Q?v87f+PAlc3ps+/KXI1qj8x9mNbxe6H6C9QaC8zZPqCtFa+qVbaJyE645Cq?= =?iso-8859-1?Q?LthUg6uL783cPJs0P0EdpdbXbuahWT7Ty8qcphtUVznmk8/BNmRpV1nkWf?= =?iso-8859-1?Q?CwEgDXt3zlHS+hjdzzYgtnhcmN0z9TEByGwj2CvgbO/QziSI6Hn3RkYZ0w?= =?iso-8859-1?Q?YytcSMm80wuHdPbIyDSC1exzxYHHJ0kTACs7yfklwRXWQjBj9TCdPbTAJQ?= =?iso-8859-1?Q?bYp5qWPuBqj12fso8Wt60KwxVuIgK32y6b3HKBJnjeciWqr0cpuZZiq4+V?= =?iso-8859-1?Q?JKBdwCXWpGW9mY4GiZ18FDvLx+JOYTiKelU0GTCnsFB5fSd2EXuu2IxxeY?= =?iso-8859-1?Q?6Z3kJ/ivNY1PObHVFXRX7LvuRHQwIOLnT6Q7isKv1QjvfVlampXYRalCn9?= =?iso-8859-1?Q?WNzXxFD+FHcbX3dLxnfaWdiZ0PRJKeZwWfXww+H809dAt1S9OV7CdQQwVv?= =?iso-8859-1?Q?+LPTfNU8PfxUSZzGI+LtS6P8Z50aFvY3dO9pimJj47WRR7usQjMuwYrFAy?= =?iso-8859-1?Q?ERckibLYMCcdIbz/E6WSImrRf66yBPxIRQFN/A0YqCwuWbuZLGm/asNU0r?= =?iso-8859-1?Q?MyMNtI+uSWdHrf/9bnKnyPA/HfHibCm9gmeBwGbVtX2jCbyJf+kh5WxAv6?= =?iso-8859-1?Q?ChAWn4xJgPaoCgbhvzaB8g4MkWkTFIMLoYVzk5x+JYb5yygc85EF4B3u/s?= =?iso-8859-1?Q?h1a5LdB04w=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: BbbSCS2G2+/sb23kY9GWEe7c1+ktDpEL/XePwQzu9yBgoFPk+lV0mBqEmhrVJSrx5ppnSzGc0HIsIXAZoiu6yPVQ0BiWR14JpKr1Qwpy+8T+4nugAOX5L/oOOzIQtWh0qm1PcIKOrKcngz4G93C7ry+9dJe33vCMqee50viH3lZcVn2ZLehU+OKCFKLgK2OHsMfRCDjsd2lrrwdCIFAGHo3/Bb/2U+n4RTWL7z9FMqd+x+YpEfazCqUl8EcTFUi6wWNTCqusgyKk8QeGP0/BHUJ8zFGQ/pdRo/t2YKj4FeAIIcpxquok1SmaMOBk5xz2339un7GklfyFKqHzct27Bg== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8d3a3f8f-560d-4e3c-10ed-08df38c2c404 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:07.3164 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: bhIOV1tgRM4pKE6mxxQLAtLtdwNnuuExeqCIN8wgMRqwiInU7BBTVhKURwMw4Nx6O3Gyehb4JtrP3b8FVY3OeIr3FK/1KO1Gi7/OQDPgBQU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SE2PPF4565C7005 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::7; envelope-from=jamin_lin@aspeedtech.com; helo=TYDPR03CU002.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611485075158500 Content-Type: text/plain; charset="utf-8" Add auto-hub and leave it off. hw_compat_11_1 turns it on, so an older machine type keeps the hub it has today and a guest saved by an older QEMU still loads. Suggested-by: Gerd Hoffmann Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/usb/hcd-ehci.h | 4 +++- hw/core/machine.c | 2 ++ hw/usb/hcd-ehci.c | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h index b5ac9c8670..db9db537ff 100644 --- a/hw/usb/hcd-ehci.h +++ b/hw/usb/hcd-ehci.h @@ -269,6 +269,7 @@ struct EHCIState { bool migrate_fetch_addr_64bit; bool caps_64bit_addr; uint32_t ctrldssegment_default; + bool auto_hub; =20 /* * EHCI spec version 1.0 Section 2.3 @@ -336,7 +337,8 @@ struct EHCIState { DEFINE_PROP_BOOL("caps-64bit-addr", _state, \ ehci.caps_64bit_addr, false), \ DEFINE_PROP_UINT32("ctrldssegment-default", _state, \ - ehci.ctrldssegment_default, 0) + ehci.ctrldssegment_default, 0), \ + DEFINE_PROP_BOOL("auto-hub", _state, ehci.auto_hub, false) =20 extern const VMStateDescription vmstate_ehci; =20 diff --git a/hw/core/machine.c b/hw/core/machine.c index f8f5b01117..0103038cad 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -43,6 +43,8 @@ GlobalProperty hw_compat_11_1[] =3D { { "sysbus-ehci-usb", "x-migrate-fetch-addr-64bit", "off" }, { "pci-ehci-usb", "x-migrate-fetch-addr-64bit", "off" }, + { "sysbus-ehci-usb", "auto-hub", "on" }, + { "pci-ehci-usb", "auto-hub", "on" }, { "base-xhci", "auto-hub", "on" }, }; const size_t hw_compat_11_1_len =3D G_N_ELEMENTS(hw_compat_11_1); diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c index f371e567f3..29b85869c3 100644 --- a/hw/usb/hcd-ehci.c +++ b/hw/usb/hcd-ehci.c @@ -2636,6 +2636,7 @@ void usb_ehci_realize(EHCIState *s, DeviceState *dev,= Error **errp) =20 usb_bus_new(&s->bus, sizeof(s->bus), s->companion_enable ? &ehci_bus_ops_companion : &ehci_bus_ops_standalone, dev); + s->bus.auto_hub =3D s->auto_hub; for (i =3D 0; i < s->portnr; i++) { usb_register_port(&s->bus, &s->ports[i], s, i, &ehci_port_ops, USB_SPEED_MASK_HIGH); --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611588; cv=pass; d=zohomail.com; s=zohoarc; b=NS7//vkGi0wjWEHww7C9w8N8N0qc1pYuC6/T6uEKMwxIXttAo/qHi39aC2233yb1sM09DWHkTHrzYjNw/oc0ndjlc4trs6vHPiwYFItn0XoH3qDunXrRvP70IMpfrUs7ZXpk8eTq9eKixvxtKTgqCG99Q94HoGJ3Jh2H+9XvlD0= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611588; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=xE60Gd690uM3B6chIq8hl6krRCwchDFsLEoPfV4qomo=; b=H7dqUOTjMLL6nof5TRUzSWPKArGr4646Ogak7vTUb3U4opyIBFulIRG5r9MGQGEYYen1AWBFEiagC/yvnurmFPkwzmEm7wWR9G0X3Bi210mPm3Qo4R40eM1p6sKoRdJyYIbmK9wMkEBTfN/MmBUC/hqWmdsMNnszYDv3ksgZc4w= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1793611588333626.5944946683478; Mon, 2 Nov 2026 01:26:28 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGK-0007eN-US; Mon, 02 Nov 2026 04:23:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFN-0007LW-5h; Mon, 02 Nov 2026 04:22:33 -0500 Received: from mail-koreacentralazlp170130006.outbound.protection.outlook.com ([2a01:111:f403:c40f::6] helo=SEYPR02CU001.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFL-0000W7-Ka; Mon, 02 Nov 2026 04:22:32 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5265.apcprd06.prod.outlook.com (2603:1096:4:1e4::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:10 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MnFfrHdPwWx8Y4Sw+qrKCqW1aK7frxtME5hYGM9EKBRdKCPf7LER1NMO5HZFpjviFp7Zw+wzLa3UAHSbAzNff9gN29yb5NLdLqIWExnOik9ba5ME9kKwzTqU7cCAEpHAefz7sk/SeLdXSc4BPdbdXtk0FnC3Wce2pk0xx00nO+FS4UWYDOIB7eGuYiKsELKdLx2rsK5ia/SeOmDu/Lvc5tzdFMupz5tV5NxIIrjp3v+5DlE7SeAuwuqRjZvgPr/pSc+LJYXxs8LTrYeDHFpgF28uhPFKRjhvF6JbmuXZBn74w7kcOR1M/Nyke3LaPhaOL/5KBbmYU2/jPFzLACmduA== 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=xE60Gd690uM3B6chIq8hl6krRCwchDFsLEoPfV4qomo=; b=LsV+cYKjbQ70aqzu8Dzd+5utFdXP/qqETsiAdGjqCj+3lZ1LSIzqX5Oh+VcjVCv8VWEvkBWYdYzSP+acu+ty5F72UXIoM9sZjb7ZKOA6PJpQyLI5ku9Xwdr+FmtzkZEVzjesWkpdVafh/l3/d//Ape+iYyD5Aqq0vLk+eurSpcSIyJcwusrw5wPUl6jQY9ERcMlqxcHwv1vNvF9VbG+jfLcBo6fyCd/rizrzcgP1WL4olOnE4r1iVkuTZU5UYChzsspHI6f601EIjhCy4zfIsX4HkGzV1mxZZpg5ChlGftrlPX5qHcsE1N5kU9P3L7AGwmtzX5YNe7Aqo+qGkhgQ6g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xE60Gd690uM3B6chIq8hl6krRCwchDFsLEoPfV4qomo=; b=XQRJrSkyp5A6kuYitfEB57Qt+rDgE3EzphhYTbs5IjAsrZVAF1l1H11/BOcbsjw607n0ibJ1Rg9y3LEiuXFqNlMVwQrCAjtTO8ujTIWqJ1P7D+h27itE3A1tPn0XHXpCMxbYthp3BAOLMd1gxJCVKLLZSzP3PifpNLR9f9zHhLXmpU0cw7RFYbpzrvKFnHOK86wU2IDlZI7USjTPkMtM1/MzczKqKlbtUF4daFs1kJdaRz0Y/6vkw9tL860qJDj/rSUB4CcRd3BoNAjLzbi5Y8WiXOxx2bXvb4KU1fP26o6owDV3dYX7fkhxiLU27LvKADD3/G41qcGVBWrODlvnTg== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 04/18] hw/usb/hcd-uhci: Add an auto-hub property and leave it off Thread-Topic: [PATCH v8 04/18] hw/usb/hcd-uhci: Add an auto-hub property and leave it off Thread-Index: AQHdaquijhRoEsXvw0qx1kFWlJ7X5g== Date: Mon, 2 Nov 2026 09:22:08 +0000 Message-ID: <20261102092201.1729245-5-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SI2PR06MB5265:EE_ x-ms-office365-filtering-correlation-id: b49c7ea6-26db-4e7a-990f-08df38c2c4ed x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|7416014|1800799024|23010399003|366016|10067099003|18002099003|22082099003|921020|38070700021|56012099006|261021121427099003|261022113327099003|261026121527099003|261009223027099003; x-microsoft-antispam-message-info: kz6AOl4PzjbI36rDYqpZnY2m7YaweWoUI0wI2MSTe0iTWC+GOGhsSFounPEd1eLsYwAnXRp6QT7tmqgLDhBQp7sYJMSxRSJl/P6EylsIsYEYjkPEKx9kMWejs+WChtwc3IyFbbxX/F+9MEOYl4BwxeEBw4IsC7hp0QIbOUAT2GsFa99kFMutgg3WvgXU3b3JK/aMwKxL9x8xQX4cdLKYeMH+G1NTal/8AU1ynWRYs08Y0eRqUzQdUFHm6otbu+w4SlGAVu5+7HeEaNj4pOr+e732y7d1hFfGzA1Si1zzFBZjl+paSi68NQj01ZHIAvPe9obKTBADxAmEFwc5LOjH1w3sUItVuTYRH09pDjHyRpWXa4lWqoYqFwAg2BII1rTDooJX5kPOtVLRHLrGb8qRv0a2ib8uoyzJFK1NzgP4tU+hbnxCtU4QJ5BBs/jIFNcar2ZFJJ3SREgUrrejByQZ3FqQ1ODvkOKH0SpqjX9g4pUb3pyhQL6ACCnTruGIwqsiWlDLeWSiAVxl5dscuXbUmOV2V2O8/e5JEANvz/NuMYp7Kspcz1JgiKJ8nqyWpzZtwSYsBtsle9XnBcaiD3nNe3AghhMQxD2plmCpH+irbZBO8drOoCLzNWJ+rBrbomVbtwUj1dHCmJYky5UEl3QQucowthMdtoP5kDRhvodtkrWTvc99oislOWAOSLRfVLz4PbT/RSIADM+iLBIV8UjYF2jFXh5Ly+1GolfYrFc6CNxWK3AZejxHe5pcERPeqF6r x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(366016)(10067099003)(18002099003)(22082099003)(921020)(38070700021)(56012099006)(261021121427099003)(261022113327099003)(261026121527099003)(261009223027099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?KTwT2wbUYlaFwjzRm9rICONNE83T24EmUZu+qaF1epqdIkT4nsyCnu6z4u?= =?iso-8859-1?Q?IoDcieBngK+GucMjQBY/iCC/4AehB17OeP48hGPUosaXZnfLiZbCqy/ZYL?= =?iso-8859-1?Q?6wtC2Ud5kuoPHLju0hZr0XG2u0cCtGi6vxKOXETGheV7Masxqd9s6b7AAK?= =?iso-8859-1?Q?09lBgWq9hNYmE90mlGJSHkdhFl7sy2C4lmJFGkLUIzvJGhZE+cixcxQtGV?= =?iso-8859-1?Q?tCxNr8ekxHOAzhtao41nVuoZilegZ4nxcIZBvG2RgmQhSibAjjVeAbfhH/?= =?iso-8859-1?Q?HFbE9Nz/Z9/bugHOhmbYygcPf8WTXBP68CQ4JxMkJc1nIbO+5nkwBIBLie?= =?iso-8859-1?Q?GTn06AHEG481jKztsZ8H0YDLIiC3meNjR75oiG6DXzwfvd0UyBzIzKlphS?= =?iso-8859-1?Q?84vXXel8W3Uqep8I04j4lQtBaRyClEPzQYIWraOAgcW6hnVVzttyPAQNCV?= =?iso-8859-1?Q?6R5rY6kwPT9ktIu+idMpys/gUr1dGogoO4tsBjDiy14gNwgRrLXu+a3oJ8?= =?iso-8859-1?Q?1rOtdKd5lrBWmHZiI0RHN0YiDxoQyBcYkIUW8cOSTUlRTXV9gSY/ZbJjEE?= =?iso-8859-1?Q?+/435kOpLJLDN1cky4b+4JMDN48wAyHhsU1ZEX0xNELnxXCeQytHsJHdg3?= =?iso-8859-1?Q?8uAaXr6YjtLvjGglsaDelkKd8qsL2GcN3Hbg37XMupUwHf5bVjd7PC5R72?= =?iso-8859-1?Q?rer9yIYsEp0ZSxcT9bBBQY+MhCqY3ZP6b+XHTyzM0QacvxaL/uYS7uq2WH?= =?iso-8859-1?Q?E096NgH4ey1ipE22CYkQ0chv4t4tQdN2bBgDTA3Zixfxx/ofsxEIOIblf6?= =?iso-8859-1?Q?pM4pzkZvxyxXMwKXRND8J2oWF+nXwWUY0qB7hwwkPzQBmyiWBw9jSYInOn?= =?iso-8859-1?Q?nRkHN5LnQrOmxiryxn8ml3dmCcfk/DXM7eTQxR5vAHbnv8U2gHXnTBAwqo?= =?iso-8859-1?Q?eIfCi0f0o4rTbgm/WnixsH8niaPlbu74tCVE2IF3r1hkgM91nf9Y/upUA6?= =?iso-8859-1?Q?ag+Ca7KQpYC9slFo78dlbWVs8Bg0s6M8AK9WwEmlFOBAUz2ShyfKvCls1k?= =?iso-8859-1?Q?uM1WfaBilGrpakwyuRygrTXGQ/Yy/5caxOc/tl41hvlWv35EQKVMBbWFEt?= =?iso-8859-1?Q?EKzKFkYMAj7EmgcbdaY2eUR2g1OqUzzma5ttUF90DO/TY5vqiWLiiVbsvN?= =?iso-8859-1?Q?i66v9d8n7iGtzBHVlCKC1JxL/7FiL7oKdeRGnoUOGuvRUJV6g2nXlw20wp?= =?iso-8859-1?Q?jLlY1hXyjKbq3y3qkrikvZYX7ZGYmCGZs/w8HZTFHAzm6sKsk4eNPUz0sF?= =?iso-8859-1?Q?n4rzKPKqysf6nmW1I35rO1uFiNLQmAfueCThgIztTiiVhxDOVXXV3+hs8A?= =?iso-8859-1?Q?eoLX+OIzVwGrZNgJBM0gbHkMyf7DQ36G/OE9Eezewy7PmZxsXefcQQ79fe?= =?iso-8859-1?Q?4tWt711uklhOSaRtLEVyjh6PkjHaJL27DHpoxpOxnzPVqzztYTklwQHHW+?= =?iso-8859-1?Q?RBcuyPwAJ+6DnBUKdhj4UDFRa8lfV8rHPCM6EhgYsazlJf1X77of3J7stn?= =?iso-8859-1?Q?s/sFRz1/OuTg2cMqYOfhV1sTwlS9asrl8CvQacmx6EhnLcGnk5685Ehduf?= =?iso-8859-1?Q?dJQ6zfAq/DAXnF8P1Kg8uuQcP/HS8zzdrFnS4enY+cEaX/QJGsDWl3H0Kr?= =?iso-8859-1?Q?mAcpk6I+DAEKnpncz3sLA8WkUG8aZddFBpUlHl7vDnL4q5LQD8b47VMeB+?= =?iso-8859-1?Q?Sjy9MKuQXQmzvyaYpjkUWzVlVxBExZYBT7PUIjuKcr/N9FqNj2iNFrfqTs?= =?iso-8859-1?Q?xYpxFes/Dw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: T26Jhc52y+vZhkfPPHQRZg+ajmrG+JqMVzeP7Kn8iTI3+RbmA33CceHIkTzRSX/UvA8i/GT0WzwM0n1s4WzH+SZj37u76MFomBOuZ+w/nKwFbNXpFlLt1jxykWGyT4ACO6uBsCidil2uRNSS3VKQcit+VjK6grGOo0w8vNoYziBLdSK0naT/5UWAao7b/5778ViNna209cDW4PPR0ct3iDZXMigyVymozt0HRJYZiFxdzhim/nFaCSmaj5ZRTz61cLxxlekiH3dW+huXfkoWxI3xLbNF6LJrP58hnF8o/f0mJvSYVFoP6pnAtQZTcktBfRoJ2EJv3AoeLRHtgz3tKg== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b49c7ea6-26db-4e7a-990f-08df38c2c4ed X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:08.7727 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 8zqZA4Fk7xR6O5nYc40QpiG+pjjYwCVp3XWWlHn65j+V9XrPJHspshqxW0/SWYK7jxsAcepVx3AmwEoA79iGLXg87pzauQ8qCao7qIBDIBU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5265 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c40f::6; envelope-from=jamin_lin@aspeedtech.com; helo=SEYPR02CU001.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611590769154100 Content-Type: text/plain; charset="utf-8" Add auto-hub and leave it off. hw_compat_11_1 turns it on, so an older machine type keeps the hub it has today and a guest saved by an older QEMU still loads. A companion UHCI adds its ports to the EHCI bus instead of making one, so there the EHCI property decides. Both property lists still define auto-hub, because hw_compat_11_1 names pci-uhci-usb, and QEMU stops when a global names a property the device does not have. Suggested-by: Gerd Hoffmann Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/usb/hcd-uhci.h | 1 + hw/core/machine.c | 1 + hw/usb/hcd-uhci.c | 3 +++ 3 files changed, 5 insertions(+) diff --git a/hw/usb/hcd-uhci.h b/hw/usb/hcd-uhci.h index 3154837f1d..06433ce3de 100644 --- a/hw/usb/hcd-uhci.h +++ b/hw/usb/hcd-uhci.h @@ -72,6 +72,7 @@ typedef struct UHCIState { char *masterbus; uint32_t firstport; uint32_t maxframes; + bool auto_hub; } UHCIState; =20 #define TYPE_UHCI "pci-uhci-usb" diff --git a/hw/core/machine.c b/hw/core/machine.c index 0103038cad..f79337e7d7 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -46,6 +46,7 @@ GlobalProperty hw_compat_11_1[] =3D { { "sysbus-ehci-usb", "auto-hub", "on" }, { "pci-ehci-usb", "auto-hub", "on" }, { "base-xhci", "auto-hub", "on" }, + { "pci-uhci-usb", "auto-hub", "on" }, }; const size_t hw_compat_11_1_len =3D G_N_ELEMENTS(hw_compat_11_1); =20 diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c index a7b9fe1317..36d4076c25 100644 --- a/hw/usb/hcd-uhci.c +++ b/hw/usb/hcd-uhci.c @@ -1213,6 +1213,7 @@ void usb_uhci_common_realize(PCIDevice *dev, Error **= errp) } } else { usb_bus_new(&s->bus, sizeof(s->bus), &uhci_bus_ops, DEVICE(dev)); + s->bus.auto_hub =3D s->auto_hub; for (i =3D 0; i < UHCI_PORTS; i++) { usb_register_port(&s->bus, &s->ports[i].port, s, i, &uhci_port= _ops, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); @@ -1260,10 +1261,12 @@ static const Property uhci_properties_companion[] = =3D { DEFINE_PROP_UINT32("firstport", UHCIState, firstport, 0), DEFINE_PROP_UINT32("bandwidth", UHCIState, frame_bandwidth, 1280), DEFINE_PROP_UINT32("maxframes", UHCIState, maxframes, 128), + DEFINE_PROP_BOOL("auto-hub", UHCIState, auto_hub, false), }; static const Property uhci_properties_standalone[] =3D { DEFINE_PROP_UINT32("bandwidth", UHCIState, frame_bandwidth, 1280), DEFINE_PROP_UINT32("maxframes", UHCIState, maxframes, 128), + DEFINE_PROP_BOOL("auto-hub", UHCIState, auto_hub, false), }; =20 static void uhci_class_init(ObjectClass *klass, const void *data) --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611523; cv=pass; d=zohomail.com; s=zohoarc; b=jI/bV6flf+2YzTX7E/fHtuYqTmSi4uRwc18yxg7EOgDmH9Pa/NGU8mBx1CZ0xXuMWMyhvVrb+mpdbsXu2FKp0TUdO9D03Emcb6OYERyhtHqlKjljxgYlWQLbLaeu5hoHvuuuPfJGXm8V4ZzWu7NEwTZBEyJ3tW/DDf5LvML9ZlQ= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611523; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=slEpC7sA1u6HimItMYOg/Z7wH4ep4k9iSBPq0AALo/Y=; b=VSxC7eqPhmODciHE6ZceCU22G44WrbqygJKNquFiAxO0QkCwu8x/Nd4olPL5csO0/yhMk696gaVq1b/Rnw9fKZybV7yW3XawBM8gg6kNkuOE7derRYm7fWdhUsdBy7GrB3AELQoT/zUVCrRCOXm4F9A0jXOnoP/dGVa+xbgyRaU= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1793611523689594.299991898916; Mon, 2 Nov 2026 01:25:23 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1467848.1676903 (Exim 4.92) (envelope-from ) id 1xNoHX-0003sN-Nv; Mon, 02 Nov 2026 09:24:47 +0000 Received: by outflank-mailman (output) from mailman id 1467848.1676903; Mon, 02 Nov 2026 09:24:47 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoHX-0003qT-Ft; Mon, 02 Nov 2026 09:24:47 +0000 Received: by outflank-mailman (input) for mailman id 1467848; Mon, 02 Nov 2026 09:22:16 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoF6-0003Ok-Eq for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 09:22:16 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1xNoF5-00GjNn-Rb for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 10:22:15 +0100 Received: from [10.42.69.4] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 6ae8563d-2eae-0a2a0a5409dd-0a2a4504c96e-40 for ; Mon, 02 Nov 2026 10:22:15 +0100 Received: from [40.107.75.138] (helo=OS8PR02CU002.outbound.protection.outlook.com) by tlsNG-ebf023.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from ) id 6ae85645-b57f-0a2a45040019-286b4b8a1b87-3 for ; Mon, 02 Nov 2026 10:22:15 +0100 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SE3PR06MB9218.apcprd06.prod.outlook.com (2603:1096:101:335::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:10 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:10 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=aspeedtech.com header.i="@aspeedtech.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BLbi5IBwvH5BtoeP7pJO/zmP2xT9XpXaJ/YjhOZukh0XKuiVkaLgwwh9R6AY+fmb+jnhDtVKNxAH4ykiKTxw0ZiN4z7ijUTNpr7KZOvY8McFyyJVgGrfB/UTZuyR5TX3SELOahiVWFgZzXtr07We1ULvmUvEoKDLCXvDnu0cx4CUqxoHpFXuRqju5AW89S1zgfn3uJX82hV9QuTU9CWczoB7kqzpZlqMq40Fu4gXxHBB8EURNzQAe6rUC4GB60LWpNBxwJI1uxKhwCRPveqtMZjqklJmfRsNFPXXvrBmBszc6S476WeE9/HUvW48AIXr9GRi6shnBHwnYtVAAvWlvA== 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=slEpC7sA1u6HimItMYOg/Z7wH4ep4k9iSBPq0AALo/Y=; b=AJGS4i4jFuhuC92d1CJxSQ1vM+tMNkrwXK0atCgeg6S+zt+U2LCLLDpiMSp7v0kf+B7xq6ki3j+CIrqqPxgB3LeX7/pK3wpIqeGb0BnuINt1Qmrhfm1SxpIq1RXNE2Qg2FI6npW2CCJhtr5a/I4/wXUkwbK5lABrTZW5MjOlxGwDUKolos5Ik+TGKl52vjss84f5D2DNQP9WJ2WcyE7ytL4v32cBjYtZUO44Sew2KUAo4gSWx3N7vBD9uL6yN2bplNyrSY35zReZoPzCXMPe/3fv6pKMnPcDP9bHlfCL8Q3/7br3cTz4GU3EbJV1m6+6a5fXDa7OVdDOy9WFkDH+mw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=slEpC7sA1u6HimItMYOg/Z7wH4ep4k9iSBPq0AALo/Y=; b=F2tdEDtJXuxucU1ffEGEkeP4mGXy8Hx1/kkWcWpe7rd36896AObJQhvayUg4/kxwLeJHZmOkpRYmRAoiKGdCKofB1AuDAi3+t3GSJFTs11WJCmdzgUTHjhzdZ6n4SVzYBbbbaxPtUnb+JOST9xIKb4wuLZ8sZIi1YJWqx4QB5/ysXS5rb5JJYiukaoK1GqpuvAkfRFsULFHOo7puLqBMY20NS0q81wtO/UbASiN9ffbgEyDRWW0QlZMTj8y18uCIQo2Ua3Oo8YB4pexgsU0MtUNkWwVmuPnhDEc8JA/sZY22Wy4Gh34kS6h4BDPoJFHDpRrBYpOPBv5+MiBGGCb7yw== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 05/18] hw/usb/hcd-ohci: Add an auto-hub property and leave it off Thread-Topic: [PATCH v8 05/18] hw/usb/hcd-ohci: Add an auto-hub property and leave it off Thread-Index: AQHdaquj7EwX/4j+EkiS0LfitZAyFA== Date: Mon, 2 Nov 2026 09:22:10 +0000 Message-ID: <20261102092201.1729245-6-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SE3PR06MB9218:EE_ x-ms-office365-filtering-correlation-id: 5b3d00d8-4f87-4138-f1e1-08df38c2c603 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|1800799024|23010399003|366016|7416014|376014|921020|38070700021|56012099006|261009223027099003|261021121427099003|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: OUkLPFmGsj0MeL1b0j1UC6ddq2OuGLcfoUhVf7atSSgJT2rB2U4R+ZakR+1v8ImvMdx/858BUSlDcMCpAIJL0AntavYSi6dzcZXcs9tj+eB07H1lKn8PBdGvphRpkNHwO7S+DuBfle6gy3kBUn/uZtblLjXG1BtQBPBHuhYPhxGPiQqcyc9XDI9dg8lOhX3A5hzXNue8oftxWpswiJbPg/9JrVSp7tfCg7f8lGJDAOpcpMkDzhgRrFiEeqBooLmVMkBG4wZR7HmidsLGWWkzWasr8oJ9UXQeQN1ODRDiTDbhyAS/GW8Cl8REFauhDpMEKMwEheht9GePaAF0nnijmBFLKtdyS/uYoNYfe4i6gIlZKlaUr4l3oh+XQDIxnGXInO4ZN+x0MxX61EMvjMmtNv2MeWxhjPwc5vSiFhPYyyFAtJOeNHZahBAS3ZzF47RLG7Iikpl7gn6e0YgM1daGtEmA7cz7dNH/SAHq6rrajmHu2Xd/mA2qSs9CU19Uz2u6ZwSTnIXKoUcfQ3N40S+a6X3HpmXZuonPhJcKeMLhC0mU7GY0UobEc2MKKlAK6H8EkdRMbfX0kCgLP2rjbT0tl444oQLe1YIGX6YCainVsspTNQq5URvnQX0sPcSq4tp1OnJSxMXMoIiNAe6bb3r+QvGCvWgThTksxUdVgb6NmuK30aE+Stnyry3QR3IEDCnyq0L1wIjIGxyqW3vKG91sRCwT47xm6Yau2cU1KF2Mg1eTB5zgPvBDjqpgd+ffyZ8m x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEZPR06MB7362.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(23010399003)(366016)(7416014)(376014)(921020)(38070700021)(56012099006)(261009223027099003)(261021121427099003)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?6t05kPOdUMBJnQ9s8bQ6xb9D0J27PNjL7ImYQaEHrb+o1m+cQgP2EMzEuM?= =?iso-8859-1?Q?zFDU+GSlVm1O6Dxv0mRf+hP0XBBszmmlKrcSy/WXzFazjF4RAt/PmftTTi?= =?iso-8859-1?Q?T5L/23Dw3Jq6xL1ogVouFaIm/zgEQ2U88vC7aTf0tQysGq5zoaeShPSyzg?= =?iso-8859-1?Q?Ua2pBaIqd1oNHRXAaALmeiPg9KsfOPuJQjytrzb9/uyvnAgqD6YS7oijpz?= =?iso-8859-1?Q?DJG85GrGkU8B3rQdGV/qR/pMGfnGTu6pWOVrhYiljCFNXgnAxkhLrGN9kR?= =?iso-8859-1?Q?C/5D+/K5QwRfDd+ETH3EIroEWCFLLV+txCPImWXEO4wO3C9unaDrfZfe+f?= =?iso-8859-1?Q?ok6djnkH1WIeYn6QRe3a2Gs7yuY8whMx0J6TAOhQkQMpBm5Z7AOYiQ/MX2?= =?iso-8859-1?Q?PyCGPorHUrBukDl1H7mpacw1SEeERWii0pjviJ1/LlDMLozG1Jm6LCpDSa?= =?iso-8859-1?Q?zzoMy4tZiYVB2RfivA3lm1A68A4vay39F0dks6F2mm68XyNQOF4tYAvB6B?= =?iso-8859-1?Q?VQb5Wq7IpHHmVjsSwgcraSkYYExdPbanMSTo2LFRvLP6t5xy09Bp3Hx5hZ?= =?iso-8859-1?Q?0hi87CCHcybXx80mwJsVUwwwQSMhIrRGN3cXNxzYH7Pcj4q+jZD1kw0Hr7?= =?iso-8859-1?Q?tlnd0rw0NAVA3R/1JCy1jHEnzu5dkCIU09Wu3s9EHk+hnrgraTSYjsAfeu?= =?iso-8859-1?Q?Wn6JPl/zPIgmT68bht9n8aVjSWIUq8AU+p7Q9En8VOx1+SZMy4XpL+XGtt?= =?iso-8859-1?Q?FGn8Uapft1Ihqk7bZ2F5OZOOM9i1v/TufObqa839usVI9BZc5ZFRuPFlao?= =?iso-8859-1?Q?d7kZR1CozFu2FnilEbW3L+lf2iM9VA7fA1BrGYY0GYnd9J4YNQH7UXB3Ee?= =?iso-8859-1?Q?3sbteORjhp2QtRMH4lBdqB6OjqHcTBpagkDyFnWImWkCDeq7WSUKQbI2eg?= =?iso-8859-1?Q?diI2gqVnFLTl9LDhc772Is/3lB5p0DC8HseIaOjpIBLJMsFpaB93JyOf8M?= =?iso-8859-1?Q?Eu2iez/U8YNqV+pn0TQvYQ5spgPrYDw6lqYIXYfHbfOpLI4EkT8OyJcz+X?= =?iso-8859-1?Q?h3qDcHuybsp8yvvvLv6AE+pBQ+bK+/J60VE+9Zb2reZuvRO51H5VsYMPwk?= =?iso-8859-1?Q?9qYcOcqtRElpMkAd9PpwSwYnHlyW9/+NpD2AHBocYjCF1NR7tFemoMaveO?= =?iso-8859-1?Q?4zgcedIr7JD2Xm8OKf3OA5iHDlvHtqlF1PcOI38CopsbwU7J+q2OwWoFq1?= =?iso-8859-1?Q?Rl4eRIPSx7KekEjRSd9XumDByOSSKmwMn5RheqBYvhmh+LBezgOhExPREv?= =?iso-8859-1?Q?RHrFp7fKYqj1JY5S2Z2NGj+Gma0/dyKWPaLWazWBGJm4T2lwX3iaRuvoc2?= =?iso-8859-1?Q?LnI1roiN8nLPROad8Ano+oeVZs2/q/G6N7aYO2FRpA6qfl/PX+PDUPL+pn?= =?iso-8859-1?Q?vDZ4n/j87zHRoMhC6Udqb9yczMZCyUeLbrT0vD+bjKA+NNDoHt12ALBcCP?= =?iso-8859-1?Q?O6NwIpvzt9ZP9sKgfbg8la+qXHLaZVS6OX7B5eCL93MYVPIFnViokzPKHv?= =?iso-8859-1?Q?X+bgq2WC9DghXGJP7ZWe0RmH751VlAlw72J14cadXyKBSW+1ewqSInS+z/?= =?iso-8859-1?Q?8AChRHHSstwdUrfWJkjjGofFboH3FB3yaC1tYxMaPGM6YhXFTkj8iVQGdH?= =?iso-8859-1?Q?4CMxiKjiWWxvbY/AAA5Q6llDAwblEN4MPRfI0vErOIZphm9f+GaHcLH14A?= =?iso-8859-1?Q?GPLa8/2u0jffZSbJEhwyyElhY1ahCZSb81UrXxM8VLlapkNXsPSdVFlAM4?= =?iso-8859-1?Q?9nB4YR2imw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: Za7xd447FRlhmCEjWm17VM0JbiZz87yEf+KTnSQZHDNtnG90aSDybNQyhP410EzoJBCBlKGgSLlC0OC7R46ry0T5umtkTBpK2kIuxecnOmRbamxsYOSr3FRdoQP29+Xsggwk1tr627byKWTSKBSuuIn8Hcow/ap6UY9SzjVQ/mSKG4h/OTZZwwMLMT7px7Dwm7Y27ZoCSoJND8zkBm0xFdelbBhokzF6AVMzZk3oRDicdPcByxWf+kX84FY//T8LfORgUhAOPOYVqMY25pRV9VNjxBz12hcPoqgMjsYFbyrI1A76S/p3G4h8riDoGZBICGmlSejUQlzz1whvOwp3sQ== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5b3d00d8-4f87-4138-f1e1-08df38c2c603 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:10.0648 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: hzYBnBlIPJrr2CefW37s+GX3s5sKbFzzjOSSusl6i7PCZdZGS3uz4jFyBUryBlQGMul3OdZkF/skp82n4IO+sZL8qilQpkyAu/kK7Iz51vQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SE3PR06MB9218 X-purgate-ID: tlsNG-ebf023/1793611335-C1ED6B50-61D51C8F/0/0 X-purgate-type: clean X-purgate-size: 4215 X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611525688154100 Content-Type: text/plain; charset="utf-8" Add auto-hub and leave it off. hw_compat_11_1 turns it on for pci-ohci and sysbus-ohci, so an older machine type keeps the hub it has today and a guest saved by an older QEMU still loads. pc87560-ohci is its own PCI front end, not a pci-ohci, so it defines the property itself. A companion OHCI adds its ports to the EHCI bus instead of making one, so there the EHCI property decides. Suggested-by: Gerd Hoffmann Signed-off-by: Jamin Lin --- hw/usb/hcd-ohci.h | 1 + hw/core/machine.c | 2 ++ hw/usb/hcd-ohci-pci.c | 1 + hw/usb/hcd-ohci-sysbus.c | 1 + hw/usb/hcd-ohci.c | 1 + hw/usb/pc87560-ohci.c | 1 + 6 files changed, 7 insertions(+) diff --git a/hw/usb/hcd-ohci.h b/hw/usb/hcd-ohci.h index d079f8d24e..43240622ef 100644 --- a/hw/usb/hcd-ohci.h +++ b/hw/usb/hcd-ohci.h @@ -98,6 +98,7 @@ struct OHCIState { =20 bool big_endian; bool consistency_check; + bool auto_hub; }; =20 #define TYPE_SYSBUS_OHCI "sysbus-ohci" diff --git a/hw/core/machine.c b/hw/core/machine.c index f79337e7d7..22d2b83459 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -47,6 +47,8 @@ GlobalProperty hw_compat_11_1[] =3D { { "pci-ehci-usb", "auto-hub", "on" }, { "base-xhci", "auto-hub", "on" }, { "pci-uhci-usb", "auto-hub", "on" }, + { "sysbus-ohci", "auto-hub", "on" }, + { "pci-ohci", "auto-hub", "on" }, }; const size_t hw_compat_11_1_len =3D G_N_ELEMENTS(hw_compat_11_1); =20 diff --git a/hw/usb/hcd-ohci-pci.c b/hw/usb/hcd-ohci-pci.c index 70c9e9ac4f..11c754a948 100644 --- a/hw/usb/hcd-ohci-pci.c +++ b/hw/usb/hcd-ohci-pci.c @@ -112,6 +112,7 @@ static const Property ohci_pci_properties[] =3D { DEFINE_PROP_STRING("masterbus", OHCIPCIState, masterbus), DEFINE_PROP_UINT32("num-ports", OHCIPCIState, num_ports, 3), DEFINE_PROP_UINT32("firstport", OHCIPCIState, firstport, 0), + DEFINE_PROP_BOOL("auto-hub", OHCIPCIState, state.auto_hub, false), }; =20 static const VMStateDescription vmstate_ohci =3D { diff --git a/hw/usb/hcd-ohci-sysbus.c b/hw/usb/hcd-ohci-sysbus.c index 4f51eebccb..69f38b9fce 100644 --- a/hw/usb/hcd-ohci-sysbus.c +++ b/hw/usb/hcd-ohci-sysbus.c @@ -61,6 +61,7 @@ static const Property ohci_sysbus_properties[] =3D { DEFINE_PROP_UINT32("num-ports", OHCISysBusState, num_ports, 3), DEFINE_PROP_UINT32("firstport", OHCISysBusState, firstport, 0), DEFINE_PROP_UINT64("dma-offset", OHCISysBusState, dma_offset, 0), + DEFINE_PROP_BOOL("auto-hub", OHCISysBusState, ohci.auto_hub, false), }; =20 static void ohci_sysbus_class_init(ObjectClass *klass, const void *data) diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c index 5e5fe41f47..2c25829b76 100644 --- a/hw/usb/hcd-ohci.c +++ b/hw/usb/hcd-ohci.c @@ -1987,6 +1987,7 @@ void usb_ohci_init(OHCIState *ohci, DeviceState *dev,= uint32_t num_ports, } } else { usb_bus_new(&ohci->bus, sizeof(ohci->bus), &ohci_bus_ops, dev); + ohci->bus.auto_hub =3D ohci->auto_hub; for (i =3D 0; i < num_ports; i++) { usb_register_port(&ohci->bus, &ohci->rhport[i].port, ohci, i, &ohci_port_ops, diff --git a/hw/usb/pc87560-ohci.c b/hw/usb/pc87560-ohci.c index cc00f6e936..66c1e62d48 100644 --- a/hw/usb/pc87560-ohci.c +++ b/hw/usb/pc87560-ohci.c @@ -296,6 +296,7 @@ static const Property ohci_pci_properties[] =3D { DEFINE_PROP_STRING("masterbus", OHCIPCIState, masterbus), DEFINE_PROP_UINT32("num-ports", OHCIPCIState, num_ports, 3), DEFINE_PROP_UINT32("firstport", OHCIPCIState, firstport, 0), + DEFINE_PROP_BOOL("auto-hub", OHCIPCIState, state.auto_hub, false), }; =20 static const VMStateDescription vmstate_ohci =3D { --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611522; cv=pass; d=zohomail.com; s=zohoarc; b=APEIqVIKENIAP6jxwpmU06p0MzC3FmsgwBWh7EOr+FBB9qRX8z3fTOEo/cOIhLPUQ8W+FZy7Ei5V+Ekv0iK1DxP1fPvKBcrumJBJk3Xkhp2dpjAgD+kJ+3OO2dQSKvPJGjVt3ko6p0YBm9kr333JHK1RLlfuzU86mYPV3w8xPgI= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611522; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vEWlejgjfgQucp6V6Ol4TvUQGfDuT+Tfdpd37ISkCag=; b=Jw69E8jIJHQoI9hsC+KQg6QXC541w9TZ7RMJCqYvtkALsMBvhNMYPy058TqcDXjoTFhEIskOm0Xt0TSKBOXnq3NwiyNOVQ91Er0hV+TrDtvYnOwq6RfabpbQ22oNnVgoQmofzhwJaypKSzQxIY0lZGrR9Z4UBP0pgtPMuCIl9GA= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1793611521545514.9800834669071; Mon, 2 Nov 2026 01:25:21 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1467853.1676915 (Exim 4.92) (envelope-from ) id 1xNoHY-00045A-Cd; Mon, 02 Nov 2026 09:24:48 +0000 Received: by outflank-mailman (output) from mailman id 1467853.1676915; Mon, 02 Nov 2026 09:24:48 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoHY-00042i-2g; Mon, 02 Nov 2026 09:24:48 +0000 Received: by outflank-mailman (input) for mailman id 1467853; Mon, 02 Nov 2026 09:22:18 +0000 Received: from mx.expurgate.net ([194.145.224.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoF8-0003Py-OU for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 09:22:18 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1xNoF7-008rD4-Us for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 10:22:17 +0100 Received: from [10.42.69.1] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 6ae8563a-e002-0a2a0a5209dd-0a2a4501c2fa-46 for ; Mon, 02 Nov 2026 10:22:17 +0100 Received: from [40.107.44.86] (helo=SEYPR02CU001.outbound.protection.outlook.com) by tlsNG-d62444.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from ) id 6ae85647-5984-0a2a45010019-286b2c56a261-3 for ; Mon, 02 Nov 2026 10:22:17 +0100 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SEYPR06MB6832.apcprd06.prod.outlook.com (2603:1096:101:1b2::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:11 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:11 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=aspeedtech.com header.i="@aspeedtech.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CyAJzpOVM6JLqr9npg11ChlRgBbNBonYEIWV8zUkbcP++0eN3QPtPpyBSh2Tx18VSqJjRd339IGNQkTdthJugzBFIdKzM73B9aNsNM2CVOZLLz89+TCvE7xRfM4pZAPfLYA6iigu8/YdUgsRwRHCLRaGM1+IBZ1FspzKcm5nzB/HgOvBSQFiFb8DgDbqhu3hHCsmJEu/6LQcaWrCQcgBvDmIx/TeG5yMuuqaTUaheZKUggfUOeoUvbDH1bOOe3N5DGT0cVfwqAMcIFUovg+bAQ1BWpcqzURMzpNddCzw0jfeTrZqKutDGChxOPVJTS9sUcXrwUc4pCMdZV6/N4Alhw== 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=vEWlejgjfgQucp6V6Ol4TvUQGfDuT+Tfdpd37ISkCag=; b=LQr29Ej/eUjnLf+YTSg9zg0brdRr6P32kmnnRaYp1WiWi1OL647qaeCS6t3akPg/+r0DxyiS1wSQSzz4oUq79yHlOP81k62MLs8GOBfR66KB1isk1l2lEkoUX/I1cTqIbFGbE0Ia1XOaqBTVcrZNxqyUlusC3y7BrIIhrgazOCsSbT7cAARPG+4vPXYuza81ZxSXq6N3FL2jhJIdp9M+eikTRTxd+aMCfdota7B/wmZXtBr1ki7WDRUpcF3Lv6LJhmlfT1bFCFziuvA5HYfcIkdYJHw4TXtoLpkrS5R4zlubgJNPUVhKutFsuc+N5lvIXnczfWEgsJMP/S9wgeCUEQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vEWlejgjfgQucp6V6Ol4TvUQGfDuT+Tfdpd37ISkCag=; b=NzxDBS+GB1fn8X+knGM8zcoli1yiOOPLpWtg1AsfxoBkq5tVfAvZ2Wz30BvXa95gKp0HSyHVhjs57uOaI3/D4mC9mbhMeZwDiPiLfZhYdKcWQI+OwRC55tPFyUCveeW5L49YYU5UAV3hbo0Acg2Gmc/Lf4AgymLPdBlqo9EqYwCeV+BccX4v7wTmQDWKYDjNyBVhP5lIpWfKO11C90Pi3hCe7KZ8Ey2QZjKmfoSqp0m2lfDy7zOdh4RDigf+A3gj6r9qKAy49/XPDaBS1p4acnn2fEXNLAwTNrZclBsBH3pCDnda61kZbcspzHb+mTHODcMTWFqc7vtLj8GnBePGNg== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 06/18] hw/usb/hcd-dwc2: Add an auto-hub property and leave it off Thread-Topic: [PATCH v8 06/18] hw/usb/hcd-dwc2: Add an auto-hub property and leave it off Thread-Index: AQHdaqukW8xwK7/WBkWVcuKiha5nVg== Date: Mon, 2 Nov 2026 09:22:11 +0000 Message-ID: <20261102092201.1729245-7-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SEYPR06MB6832:EE_ x-ms-office365-filtering-correlation-id: 7527509f-e186-497f-0cd3-08df38c2c693 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|366016|1800799024|23010399003|376014|7416014|921020|38070700021|260925022911599003|260925021311599003|260925021911599003|56012099006|261009223027099003|261021121427099003|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: wH0rrJr0cQvER08lVWSr5UigztyOc2me5sL7vI7ljOT4njPRDXDAKw/wAgVHwOx6/b2A9CadtclLE0iSxMdNOnNPoWmzt/AbHtU0rvp34jEyqoDlHtoREvNPM7w4u8gSyMcMunnNsNIzMEzKUr5WW0x8lsydgG8OvUr8TL6CL3HqkYZHR25lMwB98DLQN6KQCymMNsULhbDQWK7PmTeZmFQrAE7b2PWmi3ymD4J4X+G7m/Cs8hoy8WF0R2sf2et8SEOf4KT3NDiPWw8TmfE8bH0GZWjR7iYUvJVPCd3BH/xFXQWSIqnoCwBkX4k54Hw9O7vdsrkWAeX2Y63H1wbvtvXaAYXFUtXXGP799HC8UwKohMU2a5mt+Q19mwuJsyrpKYiLkNyQUmh4gHHgPx8K0Ygtw3UDuh7dpZhPkGjdArTE59mOhImpaJSPBQVV0eieSbHlgK9o7UB7Fv0WRFFyXWn+g2ugVO2XZsDEw0CGkfkNZW9s+7r14r7WU7qh/1j3+19OzSDNWTeHu52aJwON7ygjKvEHMOepUdBiV53J6GY4Yui7tzjZ5wavUqlEXhgKUu/R00u2k8Sq9RyxO+wcroAWjDns3e8wXGVLnvZNdBKijzxJefaSFFR3MUFi5jZ/FYMKPMM6AgGAZO04XUJVbjycL0exe83AJj62o00hw89u5Pcmes4JnZAguq9hUvBS9Au0FC9b1GUTr7jbEO01ehKXMIBquAQI1UUvIJ2agRmwQE4wIw7QzvguC8Luy2YP x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEZPR06MB7362.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(23010399003)(376014)(7416014)(921020)(38070700021)(260925022911599003)(260925021311599003)(260925021911599003)(56012099006)(261009223027099003)(261021121427099003)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?a99ExvLgJ1cRoYgVeNfaFqBjnLoN4KZni5Bz2mmr6xID702f1L3Ith7NsW?= =?iso-8859-1?Q?t8nKOw1jn/IUEO5pQvjL9WseTCmTHZOpqoPy4PZ9m0bTfv3UTfzvwV5NZe?= =?iso-8859-1?Q?WL6ZdJLaOeuwPInR2NWfZSy9sTZDIsekvn14Ewpu1Cquf8tyHGeHNoqEBF?= =?iso-8859-1?Q?n3a1++NC9z6KHsdphp7MIUx5/bdvxUm97uZX++gpoq8zGYJcUKq5PUsqkt?= =?iso-8859-1?Q?c8WPJHIjIhdhfoghJ2Ev1EtaPuho/h5JLC5FFC1fE1U3Kmqt9PA3BSopKA?= =?iso-8859-1?Q?Bb6Uo57dgp8xSs/4CkCkKViQPk84cX9xQLhfBSjm1zm2gJxElu8HJkuYpM?= =?iso-8859-1?Q?MVUXSWa5J8r0juNsc5Hq5X7UTpU+2x/AyIQIyQV82++UEU+JF4gadklukV?= =?iso-8859-1?Q?hPuFA3F3+Jeg5ITgsMvbSKkG5UHbPIb06sbU3KIS7lWMMaE1ew+zmoC0Y9?= =?iso-8859-1?Q?G5Cl5dy17szkjd168OlMrCe2AAfEoP7v+KBxcTyfFAYNUqLHAudcTqxcfS?= =?iso-8859-1?Q?buz3j/wt4TI2HcjGPvSNA2YyJoGSJuHSrV7tSiUfTHdJp9Z+8Hi5Cd287S?= =?iso-8859-1?Q?mdkcKd1w22ZXE5sGWZ53WesNYEl+oSofPGIwPWdxlzgk7gSDAX3lCJAqM8?= =?iso-8859-1?Q?FC+m7WnK0YCQcI4DXkkIlPvVBZyI3tEIEt0WIQtYsmdXtDnCu21zbt35/G?= =?iso-8859-1?Q?KEm0HKOaj+BVe8i7LZbFN1gLmjl8NUdJ4JW+Z/0w8mdwzHCEAnJsiW1dRA?= =?iso-8859-1?Q?XH3cjvsyglqATs1tCEqU/ouXzc3+GpJ4dcaJlfWw6rSQKS0PtVeYOL/6eS?= =?iso-8859-1?Q?1xgAT+T2UzRmuXgytp6SnxbDykONg1NNSd91yPRO1yMvcyRqadFYvG+Bu7?= =?iso-8859-1?Q?ylqKu18MOVXJURSNVwaTPeC2ZkOzDeu1trQcKboGHsIurH1vxw/mfXR7Rn?= =?iso-8859-1?Q?r7mdvSdCSgpimqLo4Qx2Y5z5Ce1sRkv9TytH8yulv56YuXNSwhNhJQcFbN?= =?iso-8859-1?Q?auL91PGvLaXZ6HkUP9HMeK1DQsLryhqwR9M6pkL2Li/ya9Y98g/ax6XflY?= =?iso-8859-1?Q?SjNb5arFaBCOguOCepTeNh9nTPsh8PgsOfE402CK3T0VfMJFAvWWZ6tayh?= =?iso-8859-1?Q?PuS1EDDXBrdV4/tf1m/Ae3PieuCUBczKN3/4ps9FmsU/e3CGVuLstg0ipw?= =?iso-8859-1?Q?hz3vmj6rRYWXkYrBHNZJNGMYM6fhvs1MIm0h04tSNyNRoeuDuhCLWk97cQ?= =?iso-8859-1?Q?kC6YYTYISU8ka3rJtq9tzg0VblW+mu7ZFKsyp8w12PXwzvXBcpfggaMB0f?= =?iso-8859-1?Q?+1EpnjMQCF/l1i3uBAQc6LwOLoeA0egopJVXH2s7nb+FosdIrelLXI8RTg?= =?iso-8859-1?Q?Gq6qqT4G9NHi/clyzpIsjqi5hJ9I7I/+FBF9H+++7QGKh9bT/EELuxg+t0?= =?iso-8859-1?Q?PFU5qmZPQVzR6+5tXKZNMo4PIoKMn3PbDiAXq+nTKbmBFUEUgPrMGFMHqC?= =?iso-8859-1?Q?X/2AHefPrBVoUsGh450IsqAl0JTRWbyc14r9Z3efIyaq4c1mkfaWpKgGC0?= =?iso-8859-1?Q?EITAHXo/RVayFHjokXteHJ0uc6c7pyQRmvBcTIPK0QTYT4CicMHFBvhCuv?= =?iso-8859-1?Q?xZUK/jd5l0tfOb4hDCnUHKyQha9tCuhB6FGq9pUm0wL078pRZZX9WjR70E?= =?iso-8859-1?Q?HOB/TQBznSX7h1BcH1uXb8natdw6y+UKQDkYorE37+XhgNyclyfkE8OmCU?= =?iso-8859-1?Q?gYBCr3jnyi1jbI6zCmztCoEZpPp+/CEkzvxnxe5AH8kiiIcp1+4aMXcNww?= =?iso-8859-1?Q?UHWST4WJfg=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: 4BZNIJMYTNSmv1n11VS6LiAPhrdbIzI2t1rjNF9cAOIY5nse4uNtQ6i52E0c+x14x1KXQMpSvoHVS54v/cU3zAoyxWT0sbz0MkhOeKaOQVb8P3nBjJ5MtfE1ziaO/XAy/heOTomcTGzNEnKZBrb/sk0XfTwm6i/CuU5BGh9PYjzlvnj8foc0MqIzQqtKqAvYyNrvReqLL5MlmnCPvRcYANklnZwWPmRZ5sqni1t9kmBjUVRcElwWr6hs2tnsvAvzdWJB3H1DRDDk4bY5CmSYo8uPWkkW6vl9fAxWEfCtOO9eHWR0azMSyyfjcihGqnbET3Z5YTaWnxVKHpycl9kZLg== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7527509f-e186-497f-0cd3-08df38c2c693 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:11.6043 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: U1+SOcBRUGNY0nbURzgl74h+Dzs4OVP0WHozRTwp8bel+S0fNZVR+sOga9za61ORx/pw7X/zEQgifdqRgg1nJcgicpRltGwRpUSoBJd7VkY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB6832 X-purgate-ID: tlsNG-d62444/1793611337-1D073757-2D78808E/0/0 X-purgate-type: clean X-purgate-size: 2708 X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611523592154100 Content-Type: text/plain; charset="utf-8" dwc2 has one root port and runs at full speed, so a second device only fits behind the hub. Add auto-hub and leave it off. raspi has no versioned machine type, so compat cannot reach it. bcm2835_peripherals turns the property on, and raspi keeps the hub it has today. Suggested-by: Gerd Hoffmann Signed-off-by: Jamin Lin Reviewed-by: Junjie Cao Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Junjie Cao --- hw/usb/hcd-dwc2.h | 1 + hw/arm/bcm2835_peripherals.c | 1 + hw/usb/hcd-dwc2.c | 2 ++ 3 files changed, 4 insertions(+) diff --git a/hw/usb/hcd-dwc2.h b/hw/usb/hcd-dwc2.h index 68877661ca..be06f0b0e7 100644 --- a/hw/usb/hcd-dwc2.h +++ b/hw/usb/hcd-dwc2.h @@ -167,6 +167,7 @@ struct DWC2State { uint16_t fi; uint16_t next_chan; bool working; + bool auto_hub; USBPort uport; DWC2Packet packet[DWC2_NB_CHAN]; /* one packet per c= han */ uint8_t usb_buf[DWC2_NB_CHAN][DWC2_MAX_XFER_SIZE]; /* one buffer per c= han */ diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c index 558c180df9..9187376812 100644 --- a/hw/arm/bcm2835_peripherals.c +++ b/hw/arm/bcm2835_peripherals.c @@ -152,6 +152,7 @@ static void raspi_peripherals_base_init(Object *obj) =20 /* DWC2 */ object_initialize_child(obj, "dwc2", &s->dwc2, TYPE_DWC2_USB); + qdev_prop_set_bit(DEVICE(&s->dwc2), "auto-hub", true); =20 /* CPRMAN clock manager */ object_initialize_child(obj, "cprman", &s->cprman, TYPE_BCM2835_CPRMAN= ); diff --git a/hw/usb/hcd-dwc2.c b/hw/usb/hcd-dwc2.c index cd3b61158d..14211e6413 100644 --- a/hw/usb/hcd-dwc2.c +++ b/hw/usb/hcd-dwc2.c @@ -1354,6 +1354,7 @@ static void dwc2_realize(DeviceState *dev, Error **er= rp) address_space_init(&s->dma_as, s->dma_mr, "dwc2"); =20 usb_bus_new(&s->bus, sizeof(s->bus), &dwc2_bus_ops, dev); + s->bus.auto_hub =3D s->auto_hub; usb_register_port(&s->bus, &s->uport, s, 0, &dwc2_port_ops, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL | (s->usb_version =3D=3D 2 ? USB_SPEED_MASK_HIGH : 0)); @@ -1450,6 +1451,7 @@ const VMStateDescription vmstate_dwc2_state =3D { =20 static const Property dwc2_usb_properties[] =3D { DEFINE_PROP_UINT32("usb_version", DWC2State, usb_version, 2), + DEFINE_PROP_BOOL("auto-hub", DWC2State, auto_hub, false), }; =20 static void dwc2_class_init(ObjectClass *klass, const void *data) --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611410; cv=pass; d=zohomail.com; s=zohoarc; b=iCPrvHHKO0/9Y19XEjXsKrE9DjE5epHp5bKA4qsC2tbZUtF0wj+vMBEvote/PSCwv3r9eLiLXALrCW0/OTsEx0cwPGjtxfF/gA/0p32XP7CV7LYYx82eIiPZAxgmdCYZCrplTTnGZmaMJimCgA59hh/Cmd/LWcnV/4RfwJbaYRQ= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611410; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ymaNZN2H+GfrYhLbTN7EX4AzfAlYVc4ESieedfSDjmc=; b=QnA3676kzewqbfrHAjLMfZSwWrvoaahSlwvba27SzvIWi3/jdYu06T9wuC8+HlBjU15Tbk2ZvlKStq9vWegwVqxNbP63jHgDctuQ+wvIvhZNvSgxtNPy/OiYzOQovPl6YQ0Gq3fjGieJ6vysOYEC+B6Wp6Ja2b1yfXbZibDW5bI= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1793611409238902.0071728829819; Mon, 2 Nov 2026 01:23:29 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoFQ-0007L6-Un; Mon, 02 Nov 2026 04:22:41 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFD-0007JG-Dj; Mon, 02 Nov 2026 04:22:24 -0500 Received: from mail-japaneastazlp170120005.outbound.protection.outlook.com ([2a01:111:f403:c405::5] helo=TYPPR03CU001.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFB-0000WY-Fj; Mon, 02 Nov 2026 04:22:23 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by OSNPR06MB8331.apcprd06.prod.outlook.com (2603:1096:604:470::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:13 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:13 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Upi7bML+hEO2flSysAqrv1FsxtE5fLwJhkpmsVHDObxK2AQ8S+KIu8geCVF5l9izI0BDM/kgPG/C1zFPoYhvaagl7exr+Cr5j5URcbPprODJlp3tWvSHGaBdlLqXIwCV51xeFzOBeni5yn9+p9C9OSU7SnOhkXBYXe8Cht8968KeMeX/0s6kKitNppIAkKoV47p7g87K0V9jm7MdD6dkrLZEwcIHNKV+aTr5kMVo75pP9k/iVYBcJz0xCuDXtmc9q77IidopZ2ijY41UJvquBKfZxqJzsp2ev1Ey1v2hrEv3Pql69YSn6AZAAHUQk4u5oKvXs8MHM4k21zEtZeHF9g== 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=ymaNZN2H+GfrYhLbTN7EX4AzfAlYVc4ESieedfSDjmc=; b=yafyAQQr6QR+dRyrPkkG3IeuWwV/zwT/B5SKrqfoRxkLa3OQMaqB0eBD8r+uJ3caWxF4zJguDL0szP1z2zoHNcztmOcF8xIoJoAHEzUO1lim/qMBeTlGwXD+Zz1WT6qztYrmyQigJmH24Wp+/UlIJzKI+l0dchkxltJlDLenz+Rc1ebiDAQYpcO9wQ947HS7P+3FixnXQ5xJ1Oz4KSfjPtLXTQ6d8gvlL3udCkCQwZCzgGrX4ZZY36gHaDs1WzkSFKgxDnbSqc61/qYuhDPNIbLCeToeLBcTOc+fz/JjpbnZRFnUuKNvkp+VjfqlVSK7iSbA1ICxcSIpGNObSo+QjA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ymaNZN2H+GfrYhLbTN7EX4AzfAlYVc4ESieedfSDjmc=; b=JMbtJlND9zjOXz+moFB/9B93T1c/a5Rhk/ZbjaTbOkLfAV4P0+ixjdJAhryBihwoJB6kz0rSsFY60foK0ni963mQigZwI0woIqyaq2fLZ2DHvZPrvdQW9VS4s4A7sW+UX6wh2qTMIKecXjpkmwjb6lzH/Bib5Jar4rutT7iDrDsYRhFUyG83iwlRBpTgy6+PQQrYApFbsJ2n5NBnSaVsxR82Aaa+vY3xEQ9WrQILqTk0DX0YV6d4+PFna1oa+1VHOMUNtsRat/rkp5dvO0zPF/DIr+5LGfDEHG01JWDpheFNnaHiiy+m6hlVPTML/ziJcPvHTkAfTw5lpIkZacaxhQ== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 07/18] hw/usb/xen-usb: Do not insert an automatic hub Thread-Topic: [PATCH v8 07/18] hw/usb/xen-usb: Do not insert an automatic hub Thread-Index: AQHdaqukLyeSt+lGUU6ZEok9v0k5rQ== Date: Mon, 2 Nov 2026 09:22:13 +0000 Message-ID: <20261102092201.1729245-8-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|OSNPR06MB8331:EE_ x-ms-office365-filtering-correlation-id: fb2b63a3-5d52-4f86-96b5-08df38c2c778 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|7416014|1800799024|366016|23010399003|10067099003|22082099003|18002099003|921020|38070700021|56012099006|261021121427099003|261026140227099003|261022105027099003|261028144727099003; x-microsoft-antispam-message-info: cIzMGpWHHIRZPDwo85H5kGDrByME7+1AOIOyG6oF77U9tuQE/k80PIg+1sUxpFnfUfmg63hdzuc2cgB3zpmnf20vOShsmOz6JHWE8C6chgXIklzGvFCL0NEF7hi57wdm17qtqv+Pd67Dug3N0rnIHNry5MLASgOQgX/0mexuodK+ZgUumCWnOzKaYIq7tJn/nh8xIj+nNyIa3ZcjWvTgvBjsuPXLgR0rZKyYV2tfyH/jbS8LuNwyVpk496va95596Azo4PnaTs/Vz4bNPJb7dhbAuu92wUIBwm0sOhMY9Va7M29lXXYHb5Bgwsh+/tBj4ZMJZtTaHCfT8V401g9vdypiqrI8A7EYb2xM3xZUYzpb7hgns3P6uGAhwHyaeDVBltlfdASNFFAf/gIw9b+3AY6QsdBILEkoKYuvJ4bdsn3iHbOCCsGrBALOZejGXioEXGobrNHpaaoLC+N7Rpmj2kTTc2lFKPtPyib5FrLUQpjXiP6MxSEF5BbEEus89egxlEIa6fgvO/R96f+GAX/FWfcdMB25p+oW1s5oLto6gSmcKQntYKO31CLYjJup5Hcbgj2Chn0a5uBgXJPggP5geyLs8T9IYizB8jn67J1Lx2EQ3ao6JEE1ymk+BeLNwhmyYu9WHSJ8dHttKoks7FsQpNj4QsMazfrL7wgo79vARp0HFOTT1GocOEhUsM6txN3Db1xSuWtz7myZULAHgfJ9NzXD5gnT4rkAigZW2NJX6mJW01ePQVJajOxLMLVNsJYf x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(376014)(7416014)(1800799024)(366016)(23010399003)(10067099003)(22082099003)(18002099003)(921020)(38070700021)(56012099006)(261021121427099003)(261026140227099003)(261022105027099003)(261028144727099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?o9UQOjdI7/CV47YQ/6OWByEZu90lQq02X87bWjvJKE28XqqRIMvKq/YbZN?= =?iso-8859-1?Q?mV/FTl+nUNZIAr7Bqq2lFcy3TzF6hR5wxD9p6WE2/RqQbosuGO5xaHLRzA?= =?iso-8859-1?Q?APbLk6IM8a978Ncj0U37MuHBuIyQ4IO13HWxoiBNDe8PXFnExJ2e/1LsXX?= =?iso-8859-1?Q?k5HN0JBr+wBKDF77YBPyv5YGanwLq26L4lEPp/Rwg4MZmv033b/ARZm91Z?= =?iso-8859-1?Q?Rfs4m8ZhpnVZ3/HqejPIU6FPd+oHO5VswtBv7zPbFUIDNFvGkhllIqk6Al?= =?iso-8859-1?Q?NUtDibtHof8A0sFymGePnLGIvvNbmFvuwQvlKZ1PNI59kyARDu+PY3oKYu?= =?iso-8859-1?Q?hAYwzofuAwPVZg/hF9bG6frmI8yHLq91K07emdUJh3LY8T7NvmqfNVdxYh?= =?iso-8859-1?Q?ICS8kYdoDQFRQ/QxZ1SUyVMtI7iBsSUIQzx11sWWQKj7YqhIJuwh+G9Pxx?= =?iso-8859-1?Q?m7qiC6gwwSZt5Nj56VmRXPnz6p7FVL6KhkoZBi8S+MBAVXIRb6gqV70uTL?= =?iso-8859-1?Q?rvx//erBxz1cb3sETW0C8l/gci8JlvwvKAsrtX0N+12Piy6yRiqts2qzCg?= =?iso-8859-1?Q?LViU9jR38w2H7HJYQAsPC4zKrnfk4VS3qI1/VOh1AOuHrScNFwM2myMHTf?= =?iso-8859-1?Q?BRkac+xeBSEgbBgOqFXuUUZylr/3nqLDCM+Im1RuPxe15O8ONnrjxaNLR7?= =?iso-8859-1?Q?fTkI/TQxCvLdAZKVlIbvGM4Pq0UzBS+AKB6hqlkqrvsw6hVj0JaozsoLNg?= =?iso-8859-1?Q?fUy2w/4hDgIXG3ba/n3bJR+CnbNFKFF/uP4gjVPQxkyEtICBbHCyE+Ddf/?= =?iso-8859-1?Q?S22dGbzfEqgICjuCkF55GiRhas6MfthuiWjzsjwVgwRG3CHEtVHXcBiwJ1?= =?iso-8859-1?Q?s6AHLbrMIRQhaHpgtyYuxJIBlqNNdjLMtf+IaXmBU5VPOYWpepNaJnuPtS?= =?iso-8859-1?Q?ECDJ+oVwt7SH6Kh8hxPKkHjUlx5Tz5EC0pXQKd8XlWc8bYOvVjbnCHwzQU?= =?iso-8859-1?Q?FoyeKVMM9n3E0A7902K9Gp8SJo5muzqa0XQ457uHuAaoJ6PEz8qY9U63Ja?= =?iso-8859-1?Q?A56xmErZg4pOI6U736hGApUZQ0aV/Pozr0enao7aFlQ7If0eCeqfl4z2e7?= =?iso-8859-1?Q?zl5fvH9Ms10JqY2brMmip+evIA7obISSNPmQRbl6jwrZd9tJZ3OHOPphGY?= =?iso-8859-1?Q?AkLSZeiqyeNIFYc+aGx3gZFfmx0v+xRoO8G1j9XFuCCWEP8108dplTWmHZ?= =?iso-8859-1?Q?4yAhS3AK+hO4wpzlHI1w8ST56omd00IvJvqPjC1PuNXywzplO+NGImgLGr?= =?iso-8859-1?Q?vJDo8hJ6xCCO00mXIGRwT5oHePNWU/+1shmA/5Zq8DwwUBv+tns8Da1CxO?= =?iso-8859-1?Q?/PwT70HALJUBPweMMDUu9KpdIPmNOVLJik65nzu+T+b1D7xDd3tnxe8iZT?= =?iso-8859-1?Q?Odb9dhBZO7BzXGpubRQj4KgwDXc3leJxixrbpBEbtuJX63EeKciMglSJOs?= =?iso-8859-1?Q?uYd3dHbKd6FFCGsfbcBgBRgnk+XScGj9dj799X62ZY2ha5tyaJ3Rkz/y5O?= =?iso-8859-1?Q?6OMBqljkGyYEsTixqWMiV4kAFLlP0ln9ORu9VJuWkcAwdlvxFTcn6W/UO5?= =?iso-8859-1?Q?CrOjrPDAdvIpsoGzerD7VlI3GNviELjnTNl9XCq8x5epF6X6ffbKaekgz2?= =?iso-8859-1?Q?EXbbPxEC0AqWScGgBlvyGk2IP+/wGGDnwLU/izWP8YYsVBpzRMswJR9mry?= =?iso-8859-1?Q?KjtRXUHCVY0uuqPZu/NX1hl3ugdngTf3eBo3vzCP1hxkzDIUAjcpIXrzoG?= =?iso-8859-1?Q?vP3AkgX+Qg=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: lEgt2cxkcdJwEACbP3ZS5FfSdwS/pSXGEIieZvssk6nDd6UVbSf75FWGM0uOoCmAgZA+eqMuFBtxKYTwxvxpF5r24RLWXpiF4QywYhwIqcYvnVnnbSCeuX5VEGOWpHqVQPlMmEgAFwYRfDtWNUGyJ0ME+s96sDq0nPhlrPHhkF6SugVe8yeJSP0Drd1V2dVvaGFfM7o99dpUtM02xFJ+KseLMcIFc43gfN2Zk5WZ93Z4iciJBEHs8HgVhr4Rwq6PWAFpNX4BNUqHKHN/VTJKQPzKmn0V0dbs0r+Nqdd+ZlsVzGb3uVbrXVZRe5w6/npXF+9/k4ZWdmvDzjd1hxRdjQ== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: fb2b63a3-5d52-4f86-96b5-08df38c2c778 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:13.1254 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: EBpdwFEjuvrrTKDykthoNQi0YxMHwBOzAWT5HPJ9x4OH636OxcZaZi8CovHvhONb/t8tn1+zoFgGuEgbxHWHVUZQs/nGdBLYQfyJ2ExOtLc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSNPR06MB8331 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::5; envelope-from=jamin_lin@aspeedtech.com; helo=TYPPR03CU001.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611414318158500 Content-Type: text/plain; charset="utf-8" xen-usb gives every device a port number. usb_claim_port() then uses that port, and never reaches the automatic hub. Set auto_hub to false. Every bus creator then sets the flag itself, and usb_bus_new() can stop setting a default. Suggested-by: Gerd Hoffmann Signed-off-by: Jamin Lin Acked-by: Marc-Andr=C3=A9 Lureau --- hw/usb/xen-usb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/usb/xen-usb.c b/hw/usb/xen-usb.c index caf9efbb77..5d1dbe6b1b 100644 --- a/hw/usb/xen-usb.c +++ b/hw/usb/xen-usb.c @@ -1023,6 +1023,7 @@ static void usbback_alloc(struct XenLegacyDevice *xen= dev) =20 usb_bus_new(&usbif->bus, sizeof(usbif->bus), &xen_usb_bus_ops, DEVICE(xendev)); + usbif->bus.auto_hub =3D false; for (i =3D 0; i < USBBACK_MAXPORTS; i++) { p =3D &(usbif->ports[i].port); usb_register_port(&usbif->bus, p, usbif, i, &xen_usb_port_ops, --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611484; cv=pass; d=zohomail.com; s=zohoarc; b=KPQYcJm4MK1LpdG3pdB8CsHGqSikqVXIM/EPyagWns/hrt0IS1BLdAgLM0l80NBqiuUkyWgWwCKUZ2GMCvPgHius8XR++4klnCBgcMOXfMitW/r7DH51F85rvqOyqa9CN+XOpcjbGKusfWosDXWj8KT1OyCz7vap3g3CZcJUcBQ= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611484; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lU6uLov+bGgZqeJWfdXeshDaWcQkZkWV94xA0Zrhckc=; b=kMo2Q08HIxHy3bfu01oSm6V5JVw/72Rk/aUP1gzpqHbQJS67HkvEHROrBAbwJv44KrVDfeEnVyQZoRhIYDViY0fpsUWsJQBKo/HkivoQnv7JRtXfIaUKyh6fzuz9uSr/42akrkJy1QmVxPMnzRnBnLj5TnA3H3bD1yI0MUkA0Ks= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1793611484478826.9860536252664; Mon, 2 Nov 2026 01:24:44 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGH-0007aN-1Q; Mon, 02 Nov 2026 04:23:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFE-0007Jd-Py; Mon, 02 Nov 2026 04:22:24 -0500 Received: from mail-japaneastazlp170130007.outbound.protection.outlook.com ([2a01:111:f403:c405::7] helo=TYDPR03CU002.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFB-0000Wp-SV; Mon, 02 Nov 2026 04:22:24 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SEYPR06MB7042.apcprd06.prod.outlook.com (2603:1096:101:1dc::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:14 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:14 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=x423h1X35sAG0ni9T4S1K83dtrj9qT697ZNaAjQfwp+NUeM86JaX3YBvOwW5t7rpLZ+Bd6o5ALBkvMkKeMGMAzPlPeywc1IzDm7RkkhoaI+RHrXrX4nMk2yXxPsIsKsm9eUfKbDecyuDC+Tn20pQDPDF2EAk4FWoa/lBbRoZ9hzSX/OB+WK3UWRIgYs1ignAkCz0ivkbSE26Z3Gt5HZtVrVV5cyVGmn/Yuv1XsfwvZMu6g/ZhkW4bhTyM8/RIvXMNbPASoJaaRuE/NksfRhr+5LJ/RkPk5iTuj0VXDMFG+o8GdDc3hMPZo3gDf1k6+Fp8mJu/1oayUPx1OF1vmefTA== 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=lU6uLov+bGgZqeJWfdXeshDaWcQkZkWV94xA0Zrhckc=; b=k8nDCrA3pBz1m+QmczN65ZNMtEfow+4eZSDUgu8Glsu9jEpgq0vKtpHadWPuHlmbBEIRrvz8KFeL+BbxR1JzeNkCjVLNqBsn8bduGY0HUd9gYo804GSL9Be6Vaiw2mCI+1WsRYvcLcX19mVOFQDqg/fy7cPrIhmWcRtzPyl4kkAcFXDihh4+nrWrwaQl9GG58bZG89WOt8SPKlQbhGCBz6GmujEQW9mgZoG0cQX2H9aDC8U/xTsrLYhlfVCb/+ttqjlttN3KFXMTa9YvVuiRUTzsiYj5AK+epjcp0D8e20eWWo3lbt5n8dlHaceego96iLKGKNPrHPgzDAMkAh/+7w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lU6uLov+bGgZqeJWfdXeshDaWcQkZkWV94xA0Zrhckc=; b=CbH03vDuxbtoRVN9Y6SPsgSDLadzD2L5xhk7DyFyMVrTQEAg4Hy2xPSTancuceoMc0zJJUslegP9kLWhxlqRUnHYpG1dDgDjRKMVbnXpziNelxLsWGu3HjPtAP7tLXBgwkXf9oE1mk4UDqYvyfWQlp4/JEUls21ZvTde2FnG21XYkF2Pd+Dy9DbFDKcoKPVdPRCZ6RqN07CrcFNnsprLDc+HbPjwzGMiyf6VA+YNHT1+G9t+jgHQS7hiMghHtvEYi/jlP7uBmoN0TreTD25zlEv/M6V0Fz/vxH6g80RJf467SY7JY6AK+PYQjaKlW/Ului3XRCPj59UaS7powpMa4Q== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 08/18] hw/usb/bus: Turn off the automatic hub by default Thread-Topic: [PATCH v8 08/18] hw/usb/bus: Turn off the automatic hub by default Thread-Index: AQHdaqulsdqsJFeQ9EiqkOpgDuKOtg== Date: Mon, 2 Nov 2026 09:22:14 +0000 Message-ID: <20261102092201.1729245-9-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SEYPR06MB7042:EE_ x-ms-office365-filtering-correlation-id: 00c3e1b9-ac5b-4edd-faee-08df38c2c85d x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|7416014|376014|366016|1800799024|23010399003|10067099003|18002099003|22082099003|921020|38070700021|56012099006|261021121427099003|261022105027099003|261026140227099003|261009223027099003|261028144727099003|261021123027099003; x-microsoft-antispam-message-info: aGEzX6gmeGQGPUgNIAoETceUHf97JkNAQ7P2lWvvNtA96FFZIvIY9HBpVIuhPnx0v2DfAqLrPWn8rDt0aky68lKUr5ww4QdASEZoSYzjKCUo0k5aXZc7UDj9yJ/Y3WjF/TmbLbwd0G8AV4lliSGeCSyKshLkCoFJHzBXizEJgrDUFxB8vh3ozkFYoHLNPJq1ZkSbWfS7RYiaVqEvGmqtyYtu6/yv9Mzcg0nk/XLszZbxI+iodP+bzAS0gkBEmGcLTffWQJKg6k8WDyI8Xr4Ve9fzbakzDhLXABPG9EPfyySihlXFYrn1AtxGqxQKCTFOvkN8Nwjr5OuaW8jEqQ0YUujO7xjQDpsLjFDydB89t5G/wob7RqwBY3Wv8ItfF3jdhHwMpFsVLx0dkhj4bSeZHOWJflf9N3x+S6lQlft1EoMUvhDzmaK/2PjD4AVasot0OmhU0b/566itSCgGH31UH9Ls/oIcYsEWVAAYBJetm094P265zSdz5ZpRC3K7WO6MyJoupbe3zp7gSsbqQXrNWIgrCxm2SCwSn8t9ULPGfGGb77tLsd+jY4aqqpglYEwHvqtX1hAQwsK9rFZrw/cX4gKJnLbIuO7YcejhW+QvWi7oU9FHtyvXHnSbd1s1TybZrk3HQ+P831cPZhX0HRmTZjvZn2AF/3b2ef70cHHMop6si5lHQ06yRsPM8y4RIKzwK9IfUISZF0hHW3Ub/PN0d5tyDXmSn1mOMeLJFE7OAKpxJTd8biMQAHvu3epCSS3+ x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(7416014)(376014)(366016)(1800799024)(23010399003)(10067099003)(18002099003)(22082099003)(921020)(38070700021)(56012099006)(261021121427099003)(261022105027099003)(261026140227099003)(261009223027099003)(261028144727099003)(261021123027099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?JyEpNQgYdAzO5WEtdYxS+fqbEagzOLiILMLJRL9YItUpd8KPSW0Co1fBuo?= =?iso-8859-1?Q?P6ZZ9lmNHS6EnfI9cTLPO9/NEPTShc7CY2FRA1bQj2bfupew49SYrs+kBt?= =?iso-8859-1?Q?EDcQ25lnekPEODJ+MNhNa0FKjNCqnHSnrowWb8H14U+ipVGfoVfbgJmYdZ?= =?iso-8859-1?Q?v+QRiKQiXN95CaCZuB4iovgRAjUhToIECD8BHX2k3ArY5PATfaHsWENjUl?= =?iso-8859-1?Q?WOG6TBx4GYKi9MMTPkC1YievyhG5jRYN3fMo6BU8drRzrTJgA2yK4ZXmoM?= =?iso-8859-1?Q?NjkUq2JOabeBHhrSVaWgV8VnI5kbqYhgtCj32U1oNG6vIlQ82gNvgs6zvL?= =?iso-8859-1?Q?ctWZBfsyQjsXAopzHb9sIk9RkP3HJnYkRmvgW7VKbsg0Mjpka0IiBEhnTF?= =?iso-8859-1?Q?VW3kfyQHoLG4mabes7LsIngTVDjmL3r3cLTN0x9CiltyiPtjpdNLQfATV7?= =?iso-8859-1?Q?BgDWgt477NtmDpjNJqxSUGAR8WBYBb7hRwH7e2PhJ4notUFsfl64FyrKcf?= =?iso-8859-1?Q?gy7+5mGE9W8h/e69tKU6BFx88kjqVdO0XvKL9oJFuOnPIyD12kpFaN9O0Y?= =?iso-8859-1?Q?PXXuEgwFBLiWUW2qF0Eu8M1F/b0+NfuxM9QdYKQ2xmbvKb7zutDSRABoRv?= =?iso-8859-1?Q?5i1Z9inmYoTdEjdcaAgoXWzj8Qv13rEkQSQb8ygTgfOiHNQ6OO57Y1Z/SV?= =?iso-8859-1?Q?kgXLgj6iowYlib7dd0V2kYiIVfNUvtBB8/2hN21iEKbOd1nOE50To0Fbzk?= =?iso-8859-1?Q?1EnnkzEy8QXN3CUyKk+sGT4c/IBLbsMIynd7u/8k06EaspHwXuaKX+1KQg?= =?iso-8859-1?Q?yMIjbrq8NbM7MJla8iIXuG62Q7YpdwZZkzlbz5uLY5mKumUpo7uw1aJjh0?= =?iso-8859-1?Q?wwHf/GoIBZZD/daNNTZj6SoAnroSPhLPpqWTUTqOsnrM1ZqpPhKCQHs/Ei?= =?iso-8859-1?Q?d/vDkOq6wV3k+skiLsZ0LkkWK6EgQp+k/O7nkwFWVqX3PARXO2luCmnvs9?= =?iso-8859-1?Q?ANjNfjvJPpJjZzmMFI9DkS2ZlTSJhdSdec3OZbI/8FYNppnH+4gEXZ9WCG?= =?iso-8859-1?Q?VtZ4ySzVCKHXs90qNuxCiWUI47DiSNGMfIEsTet08ELyP3gnzNdAwJ8nI/?= =?iso-8859-1?Q?wbOeLhTGc6qFCKBpijaiGtRMqW06tCorkoUXaecJ2osS3C9nDwXIuvPHYo?= =?iso-8859-1?Q?qtTI4qjzpHTsN86MOvn9a1HjC+vqsune671m8uvUbkcz1KB/ezhp1Gzep5?= =?iso-8859-1?Q?D18SKkBg4fAIj7n93E9JwrHciLf6vbtMjKCadMVRzNU/zt0CDpJZsSXo4K?= =?iso-8859-1?Q?PM+Rwl5Z5QytaxQqP2e3rEpTnYJUrhLn8CWciypYdbahuk9HRQtEmnsYCS?= =?iso-8859-1?Q?SPRc8RMQquuERyz3OglvDNtqhcp5KyoHdK7r7MMtDB3bN5RLaQg9g0PB9Y?= =?iso-8859-1?Q?450YhkvNNdIh6CAoqDFHm9rS8R+QZII1VlWlKWFiKhGLAHJN+hk82IZNOT?= =?iso-8859-1?Q?68zD6VcpuFUeux4WZwRmM5DH5dWwyj4m4y9vHdk1Qqf3Cegq2+9TsunRkN?= =?iso-8859-1?Q?To1lftBgnIJAnwUbLen6XUxyPdmE9tEVB+WJ1WAfdgPNSjwGWH57z/mJZd?= =?iso-8859-1?Q?5Ix8see2hZVcMGjV0iTuCO/1yP7XCss+70FUei9DWkcFywXFcGnEeQZPM6?= =?iso-8859-1?Q?GpQN4yJBS2gA17PiZjx50GEilp2loQ66tURb04hfQkRhetqOL6bdDOx8cy?= =?iso-8859-1?Q?juyAnb6UZDPEO66ijkSFbhVqWrNkzWwejJZWXSX21rlYuo7gITUv4TaZ2X?= =?iso-8859-1?Q?+r3uhImtmw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: YD/iLRdzUT1tG0jCMUyguyzUK7RyiM0rGP9rCSRUIzM5Fay61bClox3csWSTgZX6r2KZRV83mKpPCJgClvYOGfngPoYnu8VbkIno0RmV0iL8F1AwnhYOVNFYHgoSng/K3oXHBIWmpBo6yZOsS+X7boLHybTNjUebbgSouKejrQNj+pmsRXQ2rfR/6Xod0ByK+Z3QxVlxhPGWtAbdqL2YWnKfkxXNk7OoiZA1gijFqyt5Anmf4Zl39HKOef8KcNQZgA/ObRGQtmBgY+9v1GhjI1uoYqEtbD/Qp86d6BSGmxOnQvRrzXC6r/CuKLop0X7FWgCjXKUOfXpggVpyZgM2Sg== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 00c3e1b9-ac5b-4edd-faee-08df38c2c85d X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:14.5632 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: FEqjhM6JO3KGLmobHpLUb8Gj0/x5voIEwtzWsuk/6O4AIKTxDOseW7ZmvlqkFOzL0u4ejM0jamwhm5K1zrihcSZTdfcOpzidIV9CcHF0PUE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB7042 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::7; envelope-from=jamin_lin@aspeedtech.com; helo=TYDPR03CU002.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611486201158500 Content-Type: text/plain; charset="utf-8" Every bus creator now sets auto_hub from its own property, or clears it outright, so the value usb_bus_new() leaves there is never read. Drop the line. A new bus then has no hub unless its controller asks for one. Suggested-by: Gerd Hoffmann Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/usb/bus.c | 1 - 1 file changed, 1 deletion(-) diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 92f67de4fe..cd587db892 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -92,7 +92,6 @@ void usb_bus_new(USBBus *bus, size_t bus_size, qbus_set_bus_hotplug_handler(BUS(bus)); bus->ops =3D ops; bus->busnr =3D next_usb_bus++; - bus->auto_hub =3D true; QTAILQ_INIT(&bus->free); QTAILQ_INIT(&bus->used); QTAILQ_INSERT_TAIL(&busses, bus, next); --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611527; cv=pass; d=zohomail.com; s=zohoarc; b=fsLpB0kt06T+ieYtKZq+3mdOvtLaejVwtGg6uNTAk5sHUvqh8TBrnTPTZ37j3X/ssUpM6cUNuR7NthgXgycc0WKluF0JRqM5pbfOelOpgN3xvEUIbwOD4fc07Q3aVu0ggLi/BzG+prOiGbDKPVohnMsi7cwRMp9oiXOKzWWzk0I= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611527; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=L7ugJp5+EyBp63kk42bQjTmAv+ji8R96jAVECGk951U=; b=lzjK6BY76+YgHvrxvBUKxjTPfB9UC5qt1aTI0CiR0H3Ee4hUzljwUovgOOHZYAGuf090in0dd9NogYaUiY8IJGib/7SRxucnnaYpmbeQ90I039FWrVH/VLMuYAwFA1O9MP4yd1VQk/nnAm6dmK6QulRmQMrxI/A1teceTXCwQJ4= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1793611527566114.92696714779368; Mon, 2 Nov 2026 01:25:27 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1467858.1676931 (Exim 4.92) (envelope-from ) id 1xNoHZ-0004Sq-Fz; Mon, 02 Nov 2026 09:24:49 +0000 Received: by outflank-mailman (output) from mailman id 1467858.1676931; Mon, 02 Nov 2026 09:24:49 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoHZ-0004Pz-3Z; Mon, 02 Nov 2026 09:24:49 +0000 Received: by outflank-mailman (input) for mailman id 1467858; Mon, 02 Nov 2026 09:22:22 +0000 Received: from mx.expurgate.net ([194.145.224.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoFB-0003Re-VT for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 09:22:22 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1xNoFB-008rD4-Bd for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 10:22:21 +0100 Received: from [10.42.69.4] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 6ae85649-e002-0a2a0a5209dd-0a2a4504d398-10 for ; Mon, 02 Nov 2026 10:22:21 +0100 Received: from [40.107.75.124] (helo=OS8PR02CU002.outbound.protection.outlook.com) by tlsNG-ebf023.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from ) id 6ae8564a-b57f-0a2a45040019-286b4b7c6396-3 for ; Mon, 02 Nov 2026 10:22:20 +0100 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SEYPR06MB6333.apcprd06.prod.outlook.com (2603:1096:101:145::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:16 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:15 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=aspeedtech.com header.i="@aspeedtech.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ea40klhgdc2thbwzaGSi4pPKAIFldLRqFHhD7b3fjgjUrhf8ot7l07LQh1t1BaANxAVyLFA9tPH/E4lNQBt41Fdt35AbKWNYmgJfOj8OrogSRIhKrsz//YBjh5YNVbXchDxjDRbc8E5kHhqtMKrT7+/oigniyCrTXSP0s/7r76gJVoR8vanRTQk1d9RSnZlYg1l+1L02BtGvGJmNN3B8KlQA9RcAPsir9eYos3fTmIgb0BJYXCbjV+4Uh4dQLv75VakefC4SrhYG6Dn5wzHwl+GRaR+9MwOAtX6Fiu37YmjP8Vba0yGBY1rwXRVUFkiHJru96oZd+KCCS+Qx8WTIaA== 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=L7ugJp5+EyBp63kk42bQjTmAv+ji8R96jAVECGk951U=; b=TI/IV033LtB2ByoyIinicgx3feMchU7XZo6ZALky7FSVFCxhYPRal9cSnHS40LoYXog7txAQmsdkRteGslImzGpcqVGxgEp6bal9RwrKCMO2efBodTh2y0K5gDCwz53x1ngWyqlWbH1Az4rsrB32O79zpfflGcOby7E7EpV97A1TCUoTkgtsIEbZEG3qThEYcK/zHe0OVzRg1if5fweuqwrgclIyU0aXvaXPJvcfptyBAtQ7Ng/85ZDNin9CkwapSgBEOK8dfs7ISqb76P1UOIRmCdr6PMIcW+pH9+UislSoR97LJkmxR3HYbgTrEFf7E+gpZK4LgPNVZxq/eIsdpQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=L7ugJp5+EyBp63kk42bQjTmAv+ji8R96jAVECGk951U=; b=TBTO0ODk7THthPF6jOO+E/rNAETCq0Tsw1yfbQkcisub6P2cQs7H5lvBb7+Lsz/rz8DipKV2cRAAQjKmRvmQ0YtPfpkfO9lxBmHwMQLDDUkeofiJQB4s2spr+uDOIHYU6YobwuAd2placuVHopFzAVNtiAUG5peQFbWuKMLOJ5mFIRjkkUY4Iac2xLeR9RMaEVMXpHNsbSS2ARfz1UELtoKMkKJ6X7TYBr9PFTHRuxVtsn6NMaPSVbRNu8CjrteGGiSPm8TcuE4FCsm4kQGVZ0Z58YQm9uHlAumOE25k/7+31sZ2rVQX5+G3gpj4gks0kkRo8WMkp+uFCSh6lQxlOQ== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 09/18] hw/arm/npcm7xx: Keep the automatic hub Thread-Topic: [PATCH v8 09/18] hw/arm/npcm7xx: Keep the automatic hub Thread-Index: AQHdaqumID06mim1t02tHdx0pgsQmw== Date: Mon, 2 Nov 2026 09:22:15 +0000 Message-ID: <20261102092201.1729245-10-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SEYPR06MB6333:EE_ x-ms-office365-filtering-correlation-id: 951d9524-7c82-4a90-009a-08df38c2c921 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|366016|1800799024|23010399003|376014|7416014|921020|38070700021|56012099006|261009223027099003|261021121427099003|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: sDxZcu6GIqOObRAFleptD1z7eEhmHs8esImPR2o912MarTfq6ot+NXEJDAYV/aGXj4DnCqvBDCaZ7L59XdDn6Gd2khFsUv/vSLB8hXJHmDhoBKadpfBsNTcUNRBYm4efInADx6o+xSCqEL2nqKLkbvHTkJNUA6HfAtX3ardQVL1A+UnJOah2S5pItoSrGxq8XCqSs2tu+d4Ak+0cq4fV1KMPjYo7PEHu+MePM1BiltEqI3VAYVFgRNc5d/zvyYrs+5x/0+PxcfQfyucbxyqhr3nS7nEZJg/O6vhxd15u7tLQTXwWrhtHp1qWvm2Ik1o3ZmM1WQseb2JzAcj9oxMmagI+4hVfIpJb2Bw5HV8IiiUuKq7wvWOcgQTFsqx5wqq/pR2hgTqVcDadtckpDTCBANeNu7ozSdX0GDMzYYRicOgvuAIHzblnNHnY1jpN09mDTVOSiu3apaWFNTsabu1hYqIe5D62TO3ztX987Jj9V8aYGpYgi+8ebscg09kN/ptOmsf+S8nq9jbkqzr5Dx67XN2oHsK1sKYlVW/PURdrs3TpETjnFDv696gqL72JcF2NW21ljHr8qD8O9SXv+DLVABOV0SQpg2A/BnicLI4e/PZj1O/APpeoI/JI0mESiE0MOMCWCpPDKCfKIRXD9M6XVCZEnOwybCmSkOYmcsCzGtW0Mc928k8mf7aXo3BN1cyuXlKuKSfxg+n63vfngbzk9PHJyuFycghO9NmjujqZ2xl0bSD0WWXzhhVAx8Crd8Nq x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEZPR06MB7362.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(23010399003)(376014)(7416014)(921020)(38070700021)(56012099006)(261009223027099003)(261021121427099003)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?2GYl9b+J24KAsdAfAEazcVYEgDgNn6H4q4ZDJN+wjeHvX+i86v/tIpqpyB?= =?iso-8859-1?Q?8hxNTVLv5eCQlderDGG1pYh1V3DkqPKRndEYayF/6lC6/7/pKRpOSvtVsB?= =?iso-8859-1?Q?n7m9NOxVMBWpCTEbLR/wszhtI6nPSekmDMN/AA0KHGwDp2y5LEeikAgmTG?= =?iso-8859-1?Q?rzzZI5bb2/G/aKf9rJ1oh1akPWJb/XBoOVGTrLofhPFLIKwllqVJ4LubnG?= =?iso-8859-1?Q?CuGFmEjplxOQPqTuvkxn6+cuh7Zdg2WaqfyKrVWepRToUwV5lEpRTmurSm?= =?iso-8859-1?Q?njqp0MxKtFDm8oKRRmwQ5qOF3a/6LRDi6NaxpQCoIx/bF7kZjbTWBhiVem?= =?iso-8859-1?Q?3Qj+uQELPFRG2o0eD7ADeoaCnn2q79hlg6F0GXC5Ah0h+9GVVnDMak9szf?= =?iso-8859-1?Q?VJV7LS5+EAtKyGHAa2FvFNiHV4M6zBxM9ECczIuCNCXPSygKY4vR3DA955?= =?iso-8859-1?Q?rmRRsmQGO1/ah0f2eVEm/ZBR0/TQ8K0Nfl4zEXhgGd/pkG/k6hlL642b2U?= =?iso-8859-1?Q?lxIalU4xg4u64KNiBSgtbBc73QYCSf+pJmVtfTEZ4CyF0W89aj3xlCxs1r?= =?iso-8859-1?Q?oRBKAKFAHW++Yr8LMg0smVq+0lB+9Mft1VSNGhtYoXhDkKlt0OJznDwldc?= =?iso-8859-1?Q?lqeEybXm3RH59A3sibZlVN8f3eOXsy39d+ESEpZ9r0QerVNKmwP+W0wxju?= =?iso-8859-1?Q?KcOeADUYjZhZ5Z2wH0rVShYByMWVOWydYiqNNCo+jEdaRKH32mMR1PgiKS?= =?iso-8859-1?Q?ALFconlnATMsAhO9wVUglz+91XjUBJmM2GPFcCLD3JlSrqoKl/xMDzzFiv?= =?iso-8859-1?Q?IHV8v4wLZ4k4K3KqD9nwkz2LF0tLjHFXb/iaD6SoeTdPcE0Jau2JvNrBE/?= =?iso-8859-1?Q?+lZU5LFgj6IlyHGK7FfP8m7luGXwZ71HduF1i3p1wNhlgSNjpLcOwOsRz8?= =?iso-8859-1?Q?2JXURgRjlOSnUeFbpWBF+iQ8GNDjxygUmp977sl5bB3wOpCyylvTNH7NNl?= =?iso-8859-1?Q?DDYqzKzlt2I4BUUvSTrBVgIB2A+2ek0udEWqTHbQFXhT69yvKTb3Srd/gO?= =?iso-8859-1?Q?hZuT8chbEqKnxI7wBAM9kA3ElPcyXIhUFiDI1AR9NmQV8VjO94X02UA81P?= =?iso-8859-1?Q?bqXxUP5I3QCJY5/XuB5UciJ5b4IMr/VxrdCgRJsZREfUdNa8yRB3t9Ln74?= =?iso-8859-1?Q?nmiMLpIIHrLAgsH7TOg0P/ubzcnjWRwh2PO4HhQ7C6hEEwj8Pur0TxovvH?= =?iso-8859-1?Q?QzN1z0vy38E4xGiMmK7FAkOJUZbP8ccoxcHmTufAvYdvHHLxLNg0hkSEJh?= =?iso-8859-1?Q?OtIk/yt5fWKcEoFlf9KNRn+tecsGkF+Q6dI3xtpCiou/PFicZENmggYQZx?= =?iso-8859-1?Q?HxLE0ATJ92l2YXqEdTdyTTyu9rIny4f64CeoQyWe7R6B/wUFJMggxBtmGb?= =?iso-8859-1?Q?O/n15n4BNAkjVNbx2UsK+dPafyhle4o2388VCDoh3CH0IrHMVMorUT3MOM?= =?iso-8859-1?Q?exiqVv6A6GtPwvlCpp8/xnLHDEwYOeoDe37Kr90jC/4DIP/D+V9yE2Lf4o?= =?iso-8859-1?Q?W5Z5Ks/eOgOepkLh1QwoCc2Q/QrutZqj0qOzknCViISXyN6id4iaXJkdnS?= =?iso-8859-1?Q?iX7QW336ueCsiaPTtmYueE4xys+FHwAVDOxcZpnxF5ZHuBnfB6m33D5kKp?= =?iso-8859-1?Q?2hAFr12sG5YrdMyqDYL4Vp2kDp5D2cqXvPpl4GXoRlf2W+r0Y9if6HQLda?= =?iso-8859-1?Q?W8lOu2HHIgB9Y0x9XNvCXgBjGmTpzTBcxyeC2r3wxuLKJ+bJlfQV/gDktC?= =?iso-8859-1?Q?kOicU2lMWw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: 4DgmIJlnu6Dni/o1FZAyOKGhJDDdjVZR3r/cw4AqPr450QuYeagb+CyNZB2qjS5C7LplOoBtH5ghX69Hz7CB5OORO1MQQVHDpRycUgBQlkQUqDWjN/zRDyTXlAJR4GKlnzfjNVbtwTwf17cx1WKgTzbdKj4tX5jGfgHBE81dUp9VHph1wxZV1kZfKpC8oqzwpK89arvSzvjGv9uDTorSwxnWbWNvGUTkvTv79wSPAyB901+TonE9cqMfconBnVMyiWWVad+6sSYclFCmf1aukgj/FFP/G5332uJt4oZFT4P6nXQvs3rFgG8I3rv0ilfl+7x0dI5dBpSRIj9p2Lv7MA== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 951d9524-7c82-4a90-009a-08df38c2c921 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:15.9018 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 2h6LT/YnFpFfG4WpRpexhxpNezjx2GtBNzJP08g6rxEyIYUzIKlGK0J6qc0jm75Sb32FWQ5CNo3IdKdtjz1hrHuvk8mcYK/oMWl5cO8KF1A= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB6333 X-purgate-ID: tlsNG-ebf023/1793611340-536C2B50-EB049B03/0/0 X-purgate-type: clean X-purgate-size: 1213 X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611529002158500 Content-Type: text/plain; charset="utf-8" The OHCI companion has one port, so a second device only fits behind the hub. npcm7xx has no versioned machine type, so compat cannot reach it. Turn the property on here instead. The companion shares the EHCI bus, so the EHCI carries the property. Suggested-by: Gerd Hoffmann Signed-off-by: Jamin Lin Reviewed-by: Junjie Cao Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Junjie Cao --- hw/arm/npcm7xx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c index 695f30a0dc..3f5b33d7e3 100644 --- a/hw/arm/npcm7xx.c +++ b/hw/arm/npcm7xx.c @@ -628,6 +628,8 @@ static void npcm7xx_realize(DeviceState *dev, Error **e= rrp) /* USB Host */ object_property_set_bool(OBJECT(&s->ehci), "companion-enable", true, &error_abort); + object_property_set_bool(OBJECT(&s->ehci), "auto-hub", true, + &error_abort); sysbus_realize(SYS_BUS_DEVICE(&s->ehci), &error_abort); sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci), 0, NPCM7XX_EHCI_BA); sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci), 0, --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611525; cv=pass; d=zohomail.com; s=zohoarc; b=FPlHxwTLRljEAFF8zRntdAdSx1sISPPuiWyWOt4gAYNS4XjtM4N/5/JQ0arl/apBEivfkyIVHhbB8qPRgIYSf4a/L1RGUXPunyYsVpqPv+uh1Ctkty9qe+QSYsFNQSnJ4hvUIHAzLN4wNY6bfkYBj1gYopsySm1ezGVBXyxiRaU= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611525; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=H5O7c2hHvr9knQUvjgOqepxhL8k2phC9xq7QoLc+YJY=; b=W/T2XG4mmSRePjlbgWiq+A1liqKzjKYJC4h6d7H6qm5uebXIjvkrxkTLIlyN1KOpu3kebvZ5ms+Sjg9OP2JYxipBHGuvAG4ggfo5R+nJ6824nIZBHQt2UN2+9erXNRiC0vE1WCBe6xbW5XfqUDDx2rF2RzfTz5Bviucf+iNSVDA= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1793611525412264.90196612301645; Mon, 2 Nov 2026 01:25:25 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1467859.1676937 (Exim 4.92) (envelope-from ) id 1xNoHa-0004ZO-3Z; Mon, 02 Nov 2026 09:24:50 +0000 Received: by outflank-mailman (output) from mailman id 1467859.1676937; Mon, 02 Nov 2026 09:24:49 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoHZ-0004XV-Gu; Mon, 02 Nov 2026 09:24:49 +0000 Received: by outflank-mailman (input) for mailman id 1467859; Mon, 02 Nov 2026 09:22:22 +0000 Received: from mx.expurgate.net ([194.145.224.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoFC-0003Rg-6J for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 09:22:22 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1xNoFB-008rD4-Iq for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 10:22:21 +0100 Received: from [10.42.69.10] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 6ae8563e-e002-0a2a0a5209dd-0a2a450a9690-42 for ; Mon, 02 Nov 2026 10:22:21 +0100 Received: from [40.107.75.116] (helo=OS8PR02CU002.outbound.protection.outlook.com) by tlsNG-4011c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from ) id 6ae8564b-f2d2-0a2a450a0019-286b4b741a3a-3 for ; Mon, 02 Nov 2026 10:22:21 +0100 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SEYPR06MB6832.apcprd06.prod.outlook.com (2603:1096:101:1b2::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:17 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:17 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=aspeedtech.com header.i="@aspeedtech.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=aaXAf7byDsPUOmdZWdkdQj+RO7fWIEq874T3LNFm9YrqtOu63KzSJHTvKA1HOK6dLeh2bE5az9EcKPjmwm4/6LZzipFFVldqodVwJMdvzdMpi2sPsTD2NIGRRbgzNJKeAbKTEQvq7zAObRwR0/EBnupDw4fE9TFp3htQ4sufF5frufcMi9On9QGGRZSGX3PLM7syGFSOyCKOk6mtnoJY4Okhs4HPlE6Zr3As0te/Pts59bmgqoudeKnzZozrccTEs1JIzjZSCLHVf3VxdCnGDcLxrzbrqxy/I2ZuvHqAi4msVX737RwNgZ4C/iSefUYaQMNG22+3kneLYeA0zkX7rQ== 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=H5O7c2hHvr9knQUvjgOqepxhL8k2phC9xq7QoLc+YJY=; b=W89o1F97X6g1wRjWuwBQzcRSEnGibYdpr21obQ5YDMpHE1WTyzoLYBJkf+/6rWJWD9ZOmT7uwhmfIChOlnSaPaMKZQ5S/nZG9wNg+oIqo64b/bdBwAXh1QryLplbqBE5U4xFg/IOj1N8UDrRIEdjFkHdzlpDMu4JFosqd9vXoqHujWVOoZZ7FlW9vCblNo+w2EBqjeLBrL0lc/P5GefNE1B88DffFbqvDUvyIv4I6T40iOSumQWYmJVHJXLGdwF0G2F8gwJQJxUmwtxCuv9HSxGIFu/a9WWp7LHfarYXjimVjnvBtUsIQzcUmuQoDhFZ4fZccQXZvQw2r1Q5qMxGrA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=H5O7c2hHvr9knQUvjgOqepxhL8k2phC9xq7QoLc+YJY=; b=TU3p6docx9luHhWsoLCYyleFlNX6C/nT3kYiYYGJvwArUCe4lJpc0LKMrR3Iw8MJN/Fd05tUnk6Mv7FUxpKSGFGDVoffNofpa9LZWDyx2RBF2aSP2/3ZTU0BTzsXI5gmODFhyCpVlFn9Jh3RmGUvP8B7PdZJJfo9fBxN5yKQ11OLqRKC1+BGZcihWUf1Z+C6RpAbzD5Hx423znplt+xMFDrCa9H21c091wjFDHqG9R+3NmvkWAlrCI96opofbmjPVx3NLNLzJUX8e4Akb3+CvbCoDF9qkL/wC40lvk987+3s3mHKJ02cGWBJgsfjQVT1Gf70lD/OuhT2h/9Hlt/Tmw== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 10/18] docs/system/devices/usb: Note the automatic hub change Thread-Topic: [PATCH v8 10/18] docs/system/devices/usb: Note the automatic hub change Thread-Index: AQHdaqunzKBY01X8UU66zw8KbkYNag== Date: Mon, 2 Nov 2026 09:22:17 +0000 Message-ID: <20261102092201.1729245-11-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SEYPR06MB6832:EE_ x-ms-office365-filtering-correlation-id: 8666b692-074e-4874-741d-08df38c2c9eb x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|366016|1800799024|23010399003|376014|7416014|921020|38070700021|261021123027099003|56012099006|261009223027099003|261028144727099003|261021121427099003|261026121527099003|261022105027099003|261026140227099003|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: kPZ8BSzqxVH2Kki+N77S+H9K/0ql6Ww7MkjWLV5R6iTi6RT5XyguoMjgyMx1Sx/atGZ7dTpxk1BRYvadhdK0TxqPw9FHLyLBZ1XW9CyT7fu7kHlDlW1S+6fhNaIscms4HfC59lrgpGdkfO5oaUz+/ofq0qVdm4Vc9pxMoP9xmGnb0imMU7oT1CbkxPXZ+DiYBCsqx4PsCs1DFB0nMdKvHpdBHHDZ3AV8so54C6+xGskE9UQHJRPGGt9UHSwvIsSvff8+Hf63xvUGaFuy2mS0obpm9GMlHc2wL0dzDt98iLjB7+g3APkcNE/jOgapOIuQhqpR0klnSLp7PMkQY/FXid35Kb+8tRfYavgeSpCxG/gvUDIHia/FsjByrazfb8wnqyvO94F+riHGsUqrtVE6T6Yw3nwq1ttRWS0G4ztZS0MbeM9cziGD+yMQJfyLow5RIiIKJlLvB2oi1aP8aIpEr6qYYWjOxrZXH5XyCOTH/vZyXb/p7y72uYPmyCIqcJzowJPKBZ4uUhWucpfLYoixdUKS5nLa5O/M185qluQMdIKYGFIVBkcYis2ChQ0uGbjcKImk+GXEXtwvcpgTLP4o9Vd9D5Sc5P4tLWVSUeHJLBCDZ/wJn3KjhUW1fyHkMJV818vSzvzhOAwUpbjl4dnEW2DArZr40apQQnJ4GEGbpAabUANh3KO7lvptH6junKwGavO6ZD3yqYapAMR8GsjJzbRrLyklqM2JtOz9fGF/FHseIanB54hoAyvyLly872xi x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEZPR06MB7362.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(23010399003)(376014)(7416014)(921020)(38070700021)(261021123027099003)(56012099006)(261009223027099003)(261028144727099003)(261021121427099003)(261026121527099003)(261022105027099003)(261026140227099003)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?HcbjBbV4MQX9Pn7PxGvFStOGkK+etnRR7SB31FCzJblP5jHcRxEenYIOcZ?= =?iso-8859-1?Q?VefGs6Q4O9sG7RqnPbsJpMGGzxvCgGvDAhOqc4/ye6YVOeu37LPYf5jjjB?= =?iso-8859-1?Q?m7aUfaMcMjNuqG1wjoV5WJg2nSxwRzuWI1K+65YvN4vazf2l7+ccc+3gi7?= =?iso-8859-1?Q?+Bc8CaEy5OPOJsoX+MOTzKzBxPJW5fr2rGiBtFjZ2Vs93NCR3Q3qzBwYdz?= =?iso-8859-1?Q?2M4Zt/aqyUSLYzGZImCtHnVzRZ/l4NEDQCv6LS9GRr6zEh1Iaf6M9n64s6?= =?iso-8859-1?Q?bFPM9tGRXmIozVkBZMHHUQe8n17YpRHbjEKwtwhIm+uu2v9yLsqZIn+wJy?= =?iso-8859-1?Q?0mwA8ZhKEE4tua0/vjBLtFQioMi2lLjSoB1ye/JHSuEClq1nUK9QOYkJyf?= =?iso-8859-1?Q?A0Zno6M0ouHKtyWZ9kZptS2RxpyOlWEYUFkPTIw+OPl+QtlzwQ7NDwgf5r?= =?iso-8859-1?Q?9yVGhAzu+ktbAYbcks3Tkj2PNA6p8pr2xQMQ06HyuJP79hW9uRW58Xvp19?= =?iso-8859-1?Q?uaGhxd7wFXBymRomkbSFFw1uAQXpisAWjMivjaSyfPYttf83IYeQBdRuuI?= =?iso-8859-1?Q?3TXNKqVT/eizSuAeA+xxgm2HvEo2Mxxxg9XOGUlAtais4tbqUedor+Iikt?= =?iso-8859-1?Q?6KMfYxBPYJcSlx2twCvGDYoD2znrd5LG4ecJSCNk4QG/CkAhuLeWUBBykC?= =?iso-8859-1?Q?+9fcBEhRbCJWv1Jg8JxFlCobqo1GQVI4fJIEBkA0TIcnXoGrNXfzBHsJWP?= =?iso-8859-1?Q?T7h+asmvLpeFMuJr/WkmAwxi0k7phqo6uTpaHepPdG442sZl5gH1emEAto?= =?iso-8859-1?Q?5NnMcA3khVFqolbWqCH/07Po7u4dog1Zb8WKsircmPlrFJFlG6lHgL4gsv?= =?iso-8859-1?Q?vn7e+i1ToSYAs/8Nrb2+2Ww9HNqdVQ3Dv0ybXTTxnPNOI8A9okpbXAY4Xt?= =?iso-8859-1?Q?kV7RoG0We0fe/wNezvTmYqK+Q8xYR3c93dIjNNAD4ZqN2c8j6i0Mv1D+jI?= =?iso-8859-1?Q?YWgqzYCWnUrOzegt8TWez2Y3dSfejdaq1PPUgUirdjvs2IGRaTfwke61xM?= =?iso-8859-1?Q?giB3X3TCIHBHLJIpzZhC9WEszI6E4ZQpVLX7DLqZCx2HjDDmhUljM4A5Lz?= =?iso-8859-1?Q?MKJO8SGzfClcBgTxmfe+CY1orToCSoHo3j0VVfd0WL+mWjivGIC6JIC4tG?= =?iso-8859-1?Q?8TOB7cQQB7pcUABWhzM39qrOns8jjP3krwCYNgxgQuMynSdEh/Jh9GLL9X?= =?iso-8859-1?Q?r/AJMmBHjkVvCXHw4kJ5LXUTb9J79SswURCk1fH0jbUu3YQAOBgmfwvExg?= =?iso-8859-1?Q?JX4PKlSaluxwJBJQxIE97z4lQHN/d+27i1n/ojVf6UE5Vx554JTUvTB+Um?= =?iso-8859-1?Q?roXU44lfAh/GXAAlT7dsuW9VjO38BWOGoYeWMzCaogdvDlF+dIt4zWqmAD?= =?iso-8859-1?Q?rj0hhOizNF1hJhGmZdDxfXRYmOG5z3MmoD7zIc0fvY5MpHgl1kDb5IDumz?= =?iso-8859-1?Q?8aNCg2NhEtCmU7xCf9YcfGBBNrnSLDQdCn5Gazt0YGURN7MUFkac9ksZWu?= =?iso-8859-1?Q?CM6DFbST35k06xJOcoIevRN72EClYZRfCmu0L5jiTGb/xLpG3hDdW+uHo5?= =?iso-8859-1?Q?0OxQyzeqcd8By3BnJLvgieZm3CJybK3i9lYaoIEucIMQtlHrZ7Bjnxn1oH?= =?iso-8859-1?Q?s5RhtYVLKWTFDL3tuObk3rKEu6Z3Jnd/iYPiseinf9+fDRH00ERfuRDzAG?= =?iso-8859-1?Q?v/0pt24YLFT8XnOvMgelCcC5sUTHGTjY3xKZCK+9Pgb5uPyz0yJ7RtnITc?= =?iso-8859-1?Q?998w8GFKCw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: UWqRvB87Agax5xkqPn6DxYVPe9+mNC58k4IhbUx5/NazMmFulgMSw/MWg7GbiP0HyPZDDVxj/x5jA/wHRwafPJKRShatlkpFSh2h0BSS7IZiLcL0KyZDwW8I5Wpeqk5I7bJHdrfSWu8UXR9C2df5nV4XANMAcfK4pREXpdjhT10BC2J3Lh06FWCA1AwRBrmHHz3FaISOKUALSbWgU/Ud/rp4RSGjjBSiem8u5yeSgjXCeyv4L60r2r8NxRm7Ev02as1GQaGgHsKj73uBbiEXSsja4hPgyQTvvPiR+1Ux0zc+pN3YN0/tWtb1L/99sJEyQCBS89PYpucU/aTNGbrf8Q== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8666b692-074e-4874-741d-08df38c2c9eb X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:17.2022 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: jwsN2Wq0eKznDsaNi5z4wWKwq10XahOxVf0ETQ7X+aqjRGHkU9ltLdzAlXIHBr0/wPqluqc3ESuIjthdjWGMXPasoKT4QZxmiXgGzec1JXI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB6832 X-purgate-ID: tlsNG-4011c0/1793611341-51EC2CFC-039B9976/0/0 X-purgate-type: clean X-purgate-size: 1084 X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611527654154100 Content-Type: text/plain; charset="utf-8" The automatic hub is now off for a new machine type. Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau --- docs/system/devices/usb.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/system/devices/usb.rst b/docs/system/devices/usb.rst index dc694d23c2..24e8ccf96e 100644 --- a/docs/system/devices/usb.rst +++ b/docs/system/devices/usb.rst @@ -3,8 +3,11 @@ USB emulation =20 QEMU can emulate a PCI UHCI, OHCI, EHCI or XHCI USB controller. You can plug virtual USB devices or real host USB devices (only works with -certain host operating systems). QEMU will automatically create and -connect virtual USB hubs as necessary to connect multiple USB devices. +certain host operating systems). + +A machine type older than 11.2 plugs a virtual USB hub into the last +free port, so that more devices fit. A newer one does not, and a +device that finds no free port fails. =20 USB controllers ~~~~~~~~~~~~~~~ --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611555; cv=pass; d=zohomail.com; s=zohoarc; b=VMi7QQGlGiijP0kzmeHXf8WK+f8thdIctSvTvd7vwdJ8ACK3VrgPoBQ61kes5we3zzu++RVk2THs005xYrqZ1gM/WTf4tJnMZCjsYYOGi4cKS9Q5Di3OUBooFvnLRuEF7FHX4ByWPPmO0jEU8q8MTMvlk9wnFhUqPNW5Fktg7aM= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611555; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=icejiFuGpf+qVEtUBiMzeJvMEi17GcoPM9MYM4qmsik=; b=VrIKzLsE+TxUrFxX+WFUQMPEWxHUxThNP179h7pIVGLESU3AuIgg+4JYG0alDHRvl/DRDZzGgXREbP1prUIIEIGvC9Og7WDpBsdI/iHaJ9ceE4+UAIAwxbirtapaAR/3EO1tFAnpp04WZd8a7Wvz/7uFivMQlCFOn41Tu3piimI= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1793611555510130.99428795609845; Mon, 2 Nov 2026 01:25:55 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGD-0007V8-Hq; Mon, 02 Nov 2026 04:23:25 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFG-0007KV-MP; Mon, 02 Nov 2026 04:22:27 -0500 Received: from mail-japaneastazlp170130007.outbound.protection.outlook.com ([2a01:111:f403:c405::7] helo=TYDPR03CU002.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFD-0000X6-L4; Mon, 02 Nov 2026 04:22:26 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SEYPR06MB6824.apcprd06.prod.outlook.com (2603:1096:101:1a4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:18 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dsGPgrnBA2oravjeJk9r01LBLChIFkLu41VIsTNn2HTUOYNVb+EPoTcUivcgpgFeps1SZXHPpDzI1h2bjygp8Beh1zH++ZBl/Q7DbnvBjvP+umZrxyOtsHx4kxpzMWO80JeJ9CTPO6/TRzdf0LT322YJ2WHLg39zxTF7TjjhVHxKgMC1u4lZ24XR0qZQv3rE+RenAbaUDYLZALtGIMLJc5xSVu0uFPpJBU6dWA3RVNn5/iiFB33mr/67p3VFJAVec2HIm0BLU5kjS+HGn3LG5BzslQp0Om4yW+RSPs4WW40qqBdBkbpzl0jyCqPkSsLmEmOBMqWeDzEtnwfN7lj7/Q== 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=icejiFuGpf+qVEtUBiMzeJvMEi17GcoPM9MYM4qmsik=; b=NxrHBcS2jBD7JozZjseyw9aG/FCgun8YL5tyhdAoeQOdt5XOoHauWclJnWuqy7ORp4MxGuoNMhzDVQu6h87UQWWAwenIDhihfDpe+nvs8ie4+6MLJG9OMtBe4EhKXrNCq2k8TZp47STPh4Zhhbb51Yyut8HkrkeXvOM9crFw0TjMf8euVi/iv1Xgsy2bYbNDOL6C/e3SnRRQaX0chc8ii/MPm/m/3r/fl4nzqEKtdRAVbgz7AyK15qc7KTopmlwcH64DziQr7wW6nJuEXw6NAdBYVuI3O+GSnzlxX1EmEsPXKIxpLXZbCFb8TLlUL/L9Lt/GSKm//qdKeT5N9BFFig== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=icejiFuGpf+qVEtUBiMzeJvMEi17GcoPM9MYM4qmsik=; b=maCiI1/IPo6RIDiHP4bILEa1zkWNHBcf9q5FmjkMyb9cOhB/abooHHmn8eW6hbWQjvPCZnv7Ma9zjH3MMtYlZCcgib6GuYe1VsC8wdV1835W4pj+fN/ipZyyku7khDtSDwWH2YPLHl3j2gUsRTLjBHSGmDZkD+oukEPgKzfUeZg20aXB1vHn7j/GCWBO2nAY+Scu/0VJY+QiFD2YyAkYr4MN9JlTNl4EXk4U73llbP0K4cAwYmCEScngw2QInobougXWmZVVZvsTOZXyOorXyeXFQQMehgzct4/SxKP+N/UpD5NqHO253ycrVLz55YN6iH7hW28vEDcXRBgR7X10FA== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 11/18] hw/usb/redirect-server: Add a usbredir server device Thread-Topic: [PATCH v8 11/18] hw/usb/redirect-server: Add a usbredir server device Thread-Index: AQHdaquo7Sqzuz2N4UaAeTmCp9IJfA== Date: Mon, 2 Nov 2026 09:22:18 +0000 Message-ID: <20261102092201.1729245-12-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SEYPR06MB6824:EE_ x-ms-office365-filtering-correlation-id: 98bbcd31-43c4-43f1-a02a-08df38c2cacb x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|1800799024|366016|23010399003|376014|7416014|921020|38070700021|261021121427099003|260925022911599003|260925021311599003|260925021911599003|5023799004|56012099006|261009223027099003|261028144727099003|261021123027099003|261022075727099003|261022105027099003|261026121527099003|261026140227099003|10067099003|18002099003|22082099003|3023799007; x-microsoft-antispam-message-info: vesjlse4eLK/zV9wuxXU2dsHnuD/zYZPxbrw3pPx4S2XX2JRSIXQpsrtJz1mYjfA34lK2Ewrkg+mDMYfU3fWXmjO+kEUHAYgJlKV1QOeaUKGf7ITJkQeALqUy1r0pqq5aYnPyN6rqLlNWkn4TUfkO2+eQ+/yzzTXmfPX3LTO+CGUE9OV7y0FPd+c45pC8tbwb3IyF5JyOcNUFeOI0Gb9HIPn70n5RhDIgMtXbmo6CB4mI9aR8AoTr6/21SHSORLrfe00qKIWeWqQbUodcDmD/ZT4uFv75k1zpBjBMJ8fn+stIgP9KVfLWW+7YRZXEyazT1GcumyaXHBQskgSdS9P2i43FMVyP/k0zxkNVoEBOvVQzNJF+1KFpGHNv+458wmOfwuB+Wql8UJw+g2J4FRkyV34OwSxYr5OXc4iCHqB3cx7IduouuCctnOv8pB4camtX/fM/MwJreXuVbNkQt6+biW5asN+e5RsPNCjtNsIodwE5atEENSHPx1CuuaTUpeTYpzAEghKPIn6Ry7w38GN+uY6JwS8e8V26HK51WltshRAkGrr4BEkraV4po3pETo5GJiAappWOiBbkNbAuGlFS8t0AB8Ds1Wp3A3HRF2daDh6lohXtPr0xgbuTypZdttZuMlIR2C9ntavG11gb94cWMxUp83dV2sy9Un03s2/OYJWSazLPsc8xBAooUeOeTsFbhwbqrBLEB/UzC3lrUBjfvMNAvM5+9YNCBMxOEC0RKTX7jR4hiWXzg+lVYV68gbX x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(366016)(23010399003)(376014)(7416014)(921020)(38070700021)(261021121427099003)(260925022911599003)(260925021311599003)(260925021911599003)(5023799004)(56012099006)(261009223027099003)(261028144727099003)(261021123027099003)(261022075727099003)(261022105027099003)(261026121527099003)(261026140227099003)(10067099003)(18002099003)(22082099003)(3023799007); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?NYairemVQg6BPPiGZQYRBhemXOuHTsHW7kYcO8NNhcKd/bIFbZiPMW6klC?= =?iso-8859-1?Q?51YoT3XZFQpOYjtnGjw3KgRbq23RzFQF5wuh4najQR7dlGMWBMs+lv2uEk?= =?iso-8859-1?Q?SkRUiusN+xlEUdqbyenWaaGPVPL2Ky/401UCDiIQAERRncxH4OcxcV9zVE?= =?iso-8859-1?Q?es2cOj+FWekps4OvAoNsA+jQg855oS6eXES/cEjbEBffUUOoLjDv4MZYG7?= =?iso-8859-1?Q?mFzZB9BEU4VbjvZFiM0CzafW976lmt9FEodt/JdelZeaBpkFaedU+etpGn?= =?iso-8859-1?Q?WL4reo2+xpn3DpL7/CqcZNcIfZGOdLhj/2A6SkdvFLKZLHjNMOynDyNE/m?= =?iso-8859-1?Q?AKSZuNq2xrENbk1w+KKSdbTj4Zc8GcqG6hSBYZagUDAXG07pJW7JLb9piG?= =?iso-8859-1?Q?W4h3xSNGLUybgmxIhnSXWgcMnhgdSb87xk9DqB+xAd88pezLGkWIiDdajY?= =?iso-8859-1?Q?+KEhKgq4hcgC0qiooAxB+X2qTPXeX1MLy334aexqL3+JdCD0w3gMt6/P+C?= =?iso-8859-1?Q?j+T1mnnZfdNfkkQ/texAD3BSJK7jVTS2PTVv7FtJZXPRgbIk5tnKxzI9H7?= =?iso-8859-1?Q?A9VlpFT9faaHAodvStynHbtlTyu9HB9OGjJ42sLDxVT2cHa2AfsS3ofqU/?= =?iso-8859-1?Q?3z9QjaWr7kW97YT2BgplfyCz7fnoEc3jnax9HKTaKHsxJ7FfcqsaolovIg?= =?iso-8859-1?Q?pYAqMD7eGm5N0r7kSVTLdKRuLwcSY7VHOYughIxaF0GlnAL1MtARrEvKht?= =?iso-8859-1?Q?RAhQzpI6xx8cgbHkJgkxGnksDBdNiVEODrNWDicTX3joNCOrMTkLnGKS1P?= =?iso-8859-1?Q?NZAvwdO9kH6mCeIqVBztA+msPr9VoEfDnmBhHvy/l9zIyfv3qsO/otHuJ9?= =?iso-8859-1?Q?6aIhOQtuLQ7aVD1oOCzXEM26trWZHakAnXVYRYZcOqgCGPFhPnjIP73lul?= =?iso-8859-1?Q?I4KtL8WBCi/sdHqgNvfM7FvYWQK96kWhR0oasnGVZlsQNcHLi3LRlnqgKR?= =?iso-8859-1?Q?dcKBJEfyoBjWzcwzPd5nakymgR/TBp6o3GDlkL3FfkBJw47TeZRdtkHxDX?= =?iso-8859-1?Q?kqlDs94aXJVJHIV7DJPKCw3FZFEGu1DGJKwYpkRgSMRhlAnkO8u3/5r1KW?= =?iso-8859-1?Q?qqk1w+7UvgtPFUk/yY8c4PQ+5kiYA7W76aOZ6xsrsLlxYK7Aj73UfuFElQ?= =?iso-8859-1?Q?O9lxItwINABcrm44UFZ/04AY/JBdKBtUXLX7filsee7OzLlvyl4rCNYeZa?= =?iso-8859-1?Q?ZiB+QqeNs93OXdKKSrcDskn3YooE3zJaMgvbPx2K39tlhLS7Cxl3/mf0D5?= =?iso-8859-1?Q?mzq5Vo04wI+qyGxl/1xrcNMjtNrVnQzwc+7ALgGaVCKmQzkTUwJ9GFjg9n?= =?iso-8859-1?Q?WSC+4rjldDE05mjmqoY3v5NCB3SbGYZOCwlVFmLrJRmmIhtHrwVpYkxnaU?= =?iso-8859-1?Q?AYdMefqFyS61T3x3HPnOElFt+akGr752bS12aHGcFLrjWJgq030OUpCeEj?= =?iso-8859-1?Q?9GUlBdAiO4E9yK7FVl7uOGxTWbwAWuRYUPCsj+fvJcIqKQjqCjcCKPf//s?= =?iso-8859-1?Q?0eQ9Jps4HYHPj3hbUraoA2eyBoL4t0BPGiwyF2EkqkLrxqf6Nis5DXKmv9?= =?iso-8859-1?Q?L3U/35r8n/tUe5BFAHk9yfnX5M8r4M6YYll1mlyoDrd1gTvaezN9KsEEn7?= =?iso-8859-1?Q?gS8ZFwHMLIQMUffM5rMpU5MDPu9MWFvgCYuuUBfrbAmbLdU81C5vrdV4Q/?= =?iso-8859-1?Q?jXDh/7kuM8XA3Gi2X2+0OxmxYr4u++dxHz9/P2BgSjfL745hSvI/soIwly?= =?iso-8859-1?Q?RC6uJmDf7Q=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: Xz4+eyfZeW8S4sc9XLKUESa8fQsVDp/ZBKqAEO0XtelsBelcGiYYFSeWoo/Kj+Hh2/bn4TNyLTv6RftZ8ivl21+gczoc4FeqinstSZli8HSvdfHQ8ednuglemgiGtVGjrZvTKvTOE0wLZRqGW2F0ciKFUbyYU0FyOQXixZjilDgHP0d+kBP3VGhoWjXY3HgjvHnZ5PGoLvlRL95jJwsvrsWW7pWE0vldy62NhSjLuPEy7eWRjmgPQOgIAig8NszTmFbeQOfLn6oQq3foP7HufJA62znDMPL7YuF2vybKfMMDD4ZNfRs1CArifMkde4EfuU2eqZ9asjf8B9MeDdqbHg== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 98bbcd31-43c4-43f1-a02a-08df38c2cacb X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:18.6471 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: /8dRNTocBydkQUUUZEalZdCiPQ4/CFrceI+PDWdhTDFVPrfPGtFF0NC+w/W9vYVaKgJoi1Do5ztoIubaOrr1E84an/Ja/0MFkKF0lXWUHzg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB6824 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::7; envelope-from=jamin_lin@aspeedtech.com; helo=TYDPR03CU002.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611558221154100 Content-Type: text/plain; charset="utf-8" Add "x-usb-redir-server". It exports a USB device from this QEMU to a USB host in another QEMU, using the usbredir protocol. The other side is the existing "usb-redir" device. The name has an "x-" prefix because the device is experimental. It has to sit on the sysbus so that qdev can find the USB bus it provides, and that may change later, so the name is not fixed yet. The exported device is plugged in with "-device ,bus=3D.0". So we have to provide a USB bus. To find that bus, qdev starts at the main system bus and walks down the tree. A device that is not on a bus is not in the tree, so the bus it provides cannot be found. We have to sit on the main system bus. That makes this a sysbus device, even though it has no MMIO and no IRQ. usbredir carries one device, not a bus. A hub cannot be exported because the protocol has no device address field, so only the device on the first port is redirected. To export several devices, run one x-usb-redir-server per device, each with its own chardev. The link to the remote host is a chardev, so this device cannot be migrated. Its VMStateDescription says so with unmigratable. Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Junjie Cao Tested-by: Junjie Cao --- hw/usb/redirect-server.c | 143 +++++++++++++++++++++++++++++++++++++++ hw/usb/meson.build | 3 +- 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 hw/usb/redirect-server.c diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c new file mode 100644 index 0000000000..1423564d22 --- /dev/null +++ b/hw/usb/redirect-server.c @@ -0,0 +1,143 @@ +/* + * USB redirector, server side + * + * Copyright (c) 2026 ASPEED Technology Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Exports a locally emulated USB device to a remote USB host over the + * usbredir protocol, so a device emulated in one QEMU instance can be + * enumerated by a host controller emulated in another one. + * + * Architecture. The left column is a request going to the device. The + * right column is the answer coming back. The middle hop carries + * usbredir messages over a socket. The top and bottom hops carry + * USBPackets inside QEMU. + * + * remote QEMU: guest driver -> EHCI/XHCI + * | ^ + * USBPacket | | USBPacket + * v | + * "usb-redir" (the client) + * | ^ + * usbredir | chardev socket | usbredir + * v | + * x-usb-redir-server (the server, this file) + * | ^ + * USBPacket | | USBPacket + * v | + * any USBDevice, "-device ,bus=3D.0" + * + * "usb-redir" (hw/usb/redirect.c) is the client: + * - it takes a USBPacket from the remote guest and writes it to the + * socket as a usbredir message + * - it reads the answer from the socket and completes the USBPacket + * + * This file is the server. It does the same thing, but backwards: + * - it reads a usbredir message from the socket and runs it as a + * USBPacket on the bus below + * - it takes the result of that USBPacket and writes it back to the + * same socket as a usbredir message, for the client to read + * + * A USB device has to sit on a USB bus, and in QEMU a USB bus is always + * made by a host controller. So this file makes one and acts as the + * host controller on this side. It models no real chip: its cable is + * the chardev socket. The real host is in the other QEMU. + * + * usbredir carries one device, not a bus. A hub cannot be exported: + * the protocol has no device address field. To export several devices, + * run one x-usb-redir-server per device, each with its own chardev. + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qemu/module.h" +#include "migration/vmstate.h" +#include "hw/core/sysbus.h" +#include "hw/usb/usb.h" +#include "qom/object.h" + +#define TYPE_USB_REDIR_SERVER "x-usb-redir-server" +OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SERVER) + +struct USBRedirServer { + SysBusDevice parent_obj; + + /* USB bus */ + USBBus bus; + USBPort port; +}; + +/* + * USB port ops + */ + +static void usbredir_server_port_child_detach(USBPort *port, USBDevice *ch= ild) +{ + /* We only export the device on our own port. Nothing to do. */ +} + +static void usbredir_server_port_wakeup(USBPort *port) +{ + /* We do not pass remote wakeup to the host. Nothing to do. */ +} + +static USBPortOps usbredir_server_port_ops =3D { + .child_detach =3D usbredir_server_port_child_detach, + .wakeup =3D usbredir_server_port_wakeup, +}; + +/* + * USB bus ops + */ + +static USBBusOps usbredir_server_bus_ops =3D { +}; + +/* + * Device registration + */ + +static void usbredir_server_realize(DeviceState *dev, Error **errp) +{ + USBRedirServer *s =3D USB_REDIR_SERVER(dev); + + /* One port: usbredir carries a single device. */ + usb_bus_new(&s->bus, sizeof(s->bus), &usbredir_server_bus_ops, dev); + s->bus.auto_hub =3D false; + usb_register_port(&s->bus, &s->port, s, 0, &usbredir_server_port_ops, + USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL | + USB_SPEED_MASK_HIGH); +} + +/* + * The link to the remote host is a chardev, and we cannot migrate + * that. So this device cannot be migrated either. + */ +static const VMStateDescription vmstate_usbredir_server =3D { + .name =3D TYPE_USB_REDIR_SERVER, + .unmigratable =3D 1, +}; + +static void usbredir_server_class_init(ObjectClass *klass, const void *dat= a) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->desc =3D "USB Redirection Server"; + dc->realize =3D usbredir_server_realize; + dc->vmsd =3D &vmstate_usbredir_server; + set_bit(DEVICE_CATEGORY_USB, dc->categories); +} + +static const TypeInfo usbredir_server_types[] =3D { + { + .name =3D TYPE_USB_REDIR_SERVER, + .parent =3D TYPE_DYNAMIC_SYS_BUS_DEVICE, + .instance_size =3D sizeof(USBRedirServer), + .class_init =3D usbredir_server_class_init, + }, +}; +module_obj(TYPE_USB_REDIR_SERVER); +module_kconfig(USB); + +DEFINE_TYPES(usbredir_server_types) diff --git a/hw/usb/meson.build b/hw/usb/meson.build index 429dcd6a24..0061b935e6 100644 --- a/hw/usb/meson.build +++ b/hw/usb/meson.build @@ -78,7 +78,8 @@ endif if usbredir.found() usbredir_ss =3D ss.source_set() usbredir_ss.add(when: 'CONFIG_USB', - if_true: [usbredir, files('redirect.c', 'quirks.c')]) + if_true: [usbredir, files('redirect.c', 'quirks.c', + 'redirect-server.c')]) hw_usb_modules +=3D {'redirect': usbredir_ss} endif =20 --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611523; cv=pass; d=zohomail.com; s=zohoarc; b=aAW52FjBUqRlbBUmQVyx39r9DsdIau/8XxPuPBUUA5u4iwGZuj9hb0UMOb8IziNH+CMKv/Uo+uGwe7CNVnNQSbb0EuiEK7p+IWgF1f0W2vSxG5DwKewlglTAdT6MWAPOwRS039/oodUFJ/hRXd3CbEGaI5Ap1zO+ftRush59HuQ= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611523; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=WOCKnhAngp5J9sy19IWEJJNbBB8dRjj0l68AW4bPQTw=; b=c2jC/urJuYiB5jFG1tMQNLaiEMYw9iFfQxsCKeBdSXrhpp+u7ncLHAKwPVzphYlOjS5Lnkgq0N6Na7mwD75pyAVhkdRnM1zm7DF54LtAjPxqYWpBenCXvN1N19rQQCVwGZjz1g2BgFWul3WGvGQyNZDp7Bq3SOPwFtevYlFmHO8= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1793611523452571.0211727775805; Mon, 2 Nov 2026 01:25:23 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1467866.1676966 (Exim 4.92) (envelope-from ) id 1xNoHc-0005HC-IB; Mon, 02 Nov 2026 09:24:52 +0000 Received: by outflank-mailman (output) from mailman id 1467866.1676966; Mon, 02 Nov 2026 09:24:52 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoHb-0005E0-VA; Mon, 02 Nov 2026 09:24:51 +0000 Received: by outflank-mailman (input) for mailman id 1467866; Mon, 02 Nov 2026 09:22:32 +0000 Received: from mx.expurgate.net ([194.145.224.20]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoFM-0003UA-Hr for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 09:22:32 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1xNoFL-0071w6-Uk for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 10:22:31 +0100 Received: from [10.42.69.6] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 6ae85657-8faa-0a2a0a5109dd-0a2a4506e5cc-8 for ; Mon, 02 Nov 2026 10:22:31 +0100 Received: from [52.101.127.108] (helo=TYDPR03CU002.outbound.protection.outlook.com) by tlsNG-16d1c6.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from ) id 6ae85653-195a-0a2a45060019-34657f6c54a3-3 for ; Mon, 02 Nov 2026 10:22:29 +0100 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by JH0PR06MB6938.apcprd06.prod.outlook.com (2603:1096:990:67::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:24 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:20 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=aspeedtech.com header.i="@aspeedtech.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tY4jyuncL/jyqXxR3Wg64ANrpq5+HqpjfdRuOICMR5ty7T60XObp+HiIAK4uoMgGlAzFqGhZw0qQA/FMJeQhI43l/Mr1WYv8tGUEBbB+znPOqVp/D0XtJbj03B/xWiaOI8vBhbJlnZFr3OtbDUrunwedmTIdHj4XpOvXAHdAOgucmJ6i4zWm6gJ/U06QvgRUt0T0Nll74TB1Wh7+Ib188P23VoZSAHDOwYrpC8AtKs/y3sSYWNg4PDAfLNgQVSI/Tk/C12AQDh0uypZF+UCOVokDYqp9xRGkGIecB769PabM54DzrYZ0LD/L5fS3n5rKZ8UZYrUorVaPFATyj+udcA== 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=WOCKnhAngp5J9sy19IWEJJNbBB8dRjj0l68AW4bPQTw=; b=Qkr4vmtChgJvK1BfHyeMN+Gsrlg/b6SAzUcGwnE6oo1Z06BLzWIB/YYPTcQT5eoNfgjRZrkcHCfFcu/X8zp/T6Myd3njMWSE6cEHHPr50C3PevNl4s12dB8g0dbmanj5coETFcMgJdMMoTdyFINlOjOT39/NOfciFRZjIlZg9WXxKMmnEb6YyWzqjKOvrMi+Yg3ObUK0t2HRXuxomqdLbWvlDVuPe+u51qTV36KlhTz1qduwk2Wgdhp4qbfOH7eVbAfA3QZM3XcDwr1r31cMcl9XsiadepqHuMdhq3nWKR/RjMGAaI17he1bI09JBllOGjrvxhHFGYqrYfDFXJXJNQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WOCKnhAngp5J9sy19IWEJJNbBB8dRjj0l68AW4bPQTw=; b=ITFxLs2UbqdqpOJE8Aq8iKbt8GrJep4/n5M+/lC9WdGYDrhJe7//4PakThD5Pj8+WH1nd6uetm+0uZ+y2EkAIqaVKvgrY8xKHLBmYGn1zb6OgaTfJeH4mnkmgDfRIfrcQoA2StWLsGr06jvIrKzMHWfa2A2ZJQJYKxA7/ZY4DX8esvWqijvgPjGHAfWn2MQJnhcwr1q5Kk+DcqDh42a/qvySx38dr0oInSB+/ng0CSI7JIMifNYqLWSq8+kC9kCQZPnxW6juzFlM6LcEfUmXmkXwxcn+cA9uRVWP8S+reo+jDZlxoalH7aCwEuF4DK8lMIoo49iS4gFB1++ZmUr+WQ== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 12/18] hw/usb/redirect-server: Connect usbredirparser to a chardev Thread-Topic: [PATCH v8 12/18] hw/usb/redirect-server: Connect usbredirparser to a chardev Thread-Index: AQHdaqupk4VbrDEBxU6nbgiHGzQ0cA== Date: Mon, 2 Nov 2026 09:22:20 +0000 Message-ID: <20261102092201.1729245-13-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|JH0PR06MB6938:EE_ x-ms-office365-filtering-correlation-id: bf9e78e2-5127-4c10-0586-08df38c2cba2 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|7416014|376014|366016|1800799024|23010399003|6133799003|10067099003|18002099003|22082099003|3023799007|921020|38070700021|56012099006|5023799004|261021133027099003|261026135527099003|261021121427099003|261021130227099003|261026130827099003|261022115727099003|261022113327099003|261022075727099003|261026121527099003|261022105027099003|261026140227099003|261009223027099003|261028144727099003|261021123027099003|261021135927099003; x-microsoft-antispam-message-info: My9ihqG0UNecVIK23bTCIk+ItDux9VJ4rLSvshpO5ey5GZj5uCzrSVB9YrGotImaUpKOFqOM/VQZQU6ojC7s8oWw2D3QN3TEJWn4/1ThnK18oJ40LkRHCLVnURemqyH28jeTR1mls7EQYaTbA1Nvp4fjWp7wOzOOcm78PjyeFhpl64YiGbdJIXM4sVJJyLnbCxuC1kKYUrAphpze4Krs1ne0YIWs9+z7abBdOT88QH3ZWmB1WTFN9/MxhOotgxYPHk61E571FEMQtMAGEb/APKCYdrslvfnOGgpk4OSxFd0RSKUtprU/+JQqQBdbMaiI8om+yjEI1S2oJ7TqQ4iCPuaJPPa6Y+8gyabZ/4XTnzlN7EHgDO02X0uqVXUy7FSPh3XiCdpDcJaWPaQ4/jcOdzB3LDez8rA9cPwX1WKVAPF4TlWfusU660SIDTtNiwq36ETYYuamdxixAz9V1dxbX1jkvJH+gW1cT2TpofruDlvsDnTfehBYOeeJ2rEV3kjJjg9W4mlwoI2/nllg6+qejPxWn5im1NUUivHdVQILojjRPTTDEhPj9084P/KwfXcjH+2BkFTy0e/F/RiDBj5eIHgRHfH+gXxuJ1NtaMvJaQpSENj5TJEFoz44IqndaZMSB5qTxqPhW15GCcW4V7d5pADFjgw3/h7kTPctMPA28XIXB843zOEEP4ahLsMosY0PPvehYGVQT4kIW/KHZTbs0meMnSBNrojvIN2ZeFV3e6mmZwk6XacIkFPp+FKR+VCb x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEZPR06MB7362.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(366016)(1800799024)(23010399003)(6133799003)(10067099003)(18002099003)(22082099003)(3023799007)(921020)(38070700021)(56012099006)(5023799004)(261021133027099003)(261026135527099003)(261021121427099003)(261021130227099003)(261026130827099003)(261022115727099003)(261022113327099003)(261022075727099003)(261026121527099003)(261022105027099003)(261026140227099003)(261009223027099003)(261028144727099003)(261021123027099003)(261021135927099003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?kSpyAhkRkMgfqPVBp3p3y42nREea3DOB2XiCQPvTagTvt6Yd+ANugpHjJ5?= =?iso-8859-1?Q?Ef9HDAQPyCILsPIXvt2ovoTRhoGdCRd6FDGrhLPBRm3tC3v88cowDq11Hq?= =?iso-8859-1?Q?Jeb6tOLF/ZfV6/VH/jCEITuam9m87z/wH8lV9pq+lBGiGOxCjrYA330i3W?= =?iso-8859-1?Q?GfP9tc/FcavGqGFuD5yo+tgiSQHvC1CW1D6cAZP9RL3iIHFCaf/AMomOxM?= =?iso-8859-1?Q?+6lJcC/eIckCC7GYsQBcJ6NeTu84qCgh/ULj5CUlhgJUwxa3l7QFJrVK2l?= =?iso-8859-1?Q?90vtrYeBXlNuOsEaExiIrCUlrPERAAoaC/KJiiKXJE8UFAsByrgUY1RnI8?= =?iso-8859-1?Q?hNWGqRFPZXV0mooEcb25LexqbnA5NnaY4KdvjEDrN4pwdWvZ3efjGSf+cw?= =?iso-8859-1?Q?hf29p7LP1tgQ/K5kfOuXyABrCy2VW5nmFrFGZ/DIfmxE294jG0g7tE4VTF?= =?iso-8859-1?Q?OxB9Flsa1xZe+d9UhGXj4uBjvxCscB0oxtRmEI4VnXlfcm0OaXG4YTiKBo?= =?iso-8859-1?Q?AgQwE8gmdM6zL6M3PVc16tzQ7m4j9dszJoELHE+e5228LVOvl27TPNqZyP?= =?iso-8859-1?Q?iLf8xMFtDQzQWYFOzoc26/9J2OChNvCjA52XLRSYB29+82ZA0P5jFKZ3OR?= =?iso-8859-1?Q?u5crONKL1AXqhOg9nBoaK3Jqfv4TwivtSJVOCTHBAKRGh2daXHHTrC4PuB?= =?iso-8859-1?Q?eiPj+tM7lNc9i1v2Yd2EsYb++f1gO6iM8AcdWK8APMqkX/b9r7s6ETdzG8?= =?iso-8859-1?Q?OlASfH5ODRaaLCyfxPkU0m5vT5dBEPux+yvNt+Q6ka7mF+sNWWbTpTzBPh?= =?iso-8859-1?Q?hjeuGcqC7omtfPjLlJvfSG0xpDcmg/BpRQo7PV/tTIh8ZS530eMAklCcF0?= =?iso-8859-1?Q?/3FZK0b9TnFDDRWOMdXeAUQ7GAl/P8mT5/RD8TkydTY8ZGzNHBJkAegEEv?= =?iso-8859-1?Q?Rg6lLsnD2ZR0ijAeXnpmICtjBvgCM6XILQu02i4DIxzBTnpaqEOPJPeX2p?= =?iso-8859-1?Q?FV7tzRAjrVG1KNQGrYCrB4g5RPPuQtIjKs+zAqEIQhWZypDyvoFWgyYbye?= =?iso-8859-1?Q?2dXxAYSW1tp7GCcMsIvskFGBKULQcV03ymCvwUc/33zWxpY8a07+rE+G/5?= =?iso-8859-1?Q?sKThClcRhKA4T2aZ5z1Mu5/ZtCr7OomSdGcaekKoDR9PuLYj4RpDb09CHD?= =?iso-8859-1?Q?IEB7CGncq3PRmhLNbqSgB/VoUoCYUINrzFTIl1WT23vipFB5j4JdaVZv4X?= =?iso-8859-1?Q?DgY+nK/UBdpejMeipzRFJEWypsWLAfKa8fz6ZVylE3sJ4iQ/elBnBdoByd?= =?iso-8859-1?Q?OPUWdxtQN3uNjlYegccvjXD91BCbGKgPnazOt37vJt5MgU3zhntezesLGV?= =?iso-8859-1?Q?NplvosDmmQjLSnoBqs5hRus87tv+0r/RGJjhrOZMleJ/AvkgFEc1HwAOTS?= =?iso-8859-1?Q?RrHvNG/EkvpFFi92VYlwYKHWjlb6CU2jQobnI9Kw1dDFjpQecrP2pJ525v?= =?iso-8859-1?Q?0fvIuRl6ynIVHWK8N1L6GiXkOwdr5SaI36M/eKcKHHcixdtL2oURnbTHJ1?= =?iso-8859-1?Q?m+EITOKJLmQhP5U8ZNhLkSe528FaU5/6src8EiOFzEbWhQBoOgcSHBK2pG?= =?iso-8859-1?Q?2+e5NS1MjGysWW75H6Jl8QGuevCST+YYQ5TPkFjf32Q5aBpgVKCIdqgjIP?= =?iso-8859-1?Q?OYxur5WvHjRBxwUdm7/uIKcVKC8RvkoJtoXoybxp/1PfiSFI66apPrdY+y?= =?iso-8859-1?Q?kchBNOjWeZBDRH5QYVFbGze3bUN1OCopZl4gVN0xcZYy1ucJo2cegKOmNs?= =?iso-8859-1?Q?rX3nWnE/6g=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: JpdWGLMUBvSRa5nSJDXlHcDiBnW81IQhII0UgSh27sj6mJq8rYSN7sWoXF8ffEaLwq8Y0PXTt3+IKAaXXICDEmPEhvXWIuCBSwYWhztupLzJptW3EYxUNod6CTgLx7YGhF26QBv2mihnFujnaH6F9TF2RsnEx7d2WGLIR4l8i8vlZPFJnCORpXxvscmnzXyelhl5L7G+LZpcjAVbvfBXXdnFwqGVmNFJTg74C1djHvg9aJkbkCz6lNVwXqBh8oa7sfN7DIklt5CYTVonO1gFqFFNYUi1la79RS9JHTtHsPe4g+z5CGrNRsyaLbUQLAnQ2mMR9Sdhf1ydat+Oda+PUg== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bf9e78e2-5127-4c10-0586-08df38c2cba2 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:20.1035 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: gjPDsXeG52IzYCzQ4W3vy5Hp7gtgbjEG1CokJKUxwNLsW9ft/c0wR0EzbPjB61qIzuVsDDWXHvEIVLHV9tvzaTvcmDpTz2Bj3uA/aiAn39U= X-MS-Exchange-Transport-CrossTenantHeadersStamped: JH0PR06MB6938 X-purgate-ID: tlsNG-16d1c6/1793611350-F647377B-E069AF7D/0/0 X-purgate-type: clean X-purgate-size: 13438 X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611525806154100 Content-Type: text/plain; charset="utf-8" Create a usbredirparser when the chardev opens. Feed it from the chardev read handler. Destroy it when the chardev closes. The side that exports a device sets usbredirparser_fl_usb_host. This side drives the device, so it is the USB host for it. redirect.c is the other side and does not set the flag. The library uses it to decide which direction a packet may travel. The chardev handling follows hw/usb/redirect.c: take no data before the parser exists, do not write to a closed backend, do not re-enter the writer, and let a close that is still queued finish before a new connection opens. Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Junjie Cao Tested-by: Junjie Cao --- hw/usb/redirect-server.c | 285 +++++++++++++++++++++++++++++++++++++++ hw/usb/trace-events | 6 + 2 files changed, 291 insertions(+) diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index 1423564d22..f78351bde9 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -50,22 +50,46 @@ */ =20 #include "qemu/osdep.h" +#include "qemu/units.h" #include "qapi/error.h" +#include "qemu/error-report.h" +#include "qemu/main-loop.h" #include "qemu/module.h" #include "migration/vmstate.h" #include "hw/core/sysbus.h" #include "hw/usb/usb.h" +#include "chardev/char-fe.h" #include "qom/object.h" =20 +#include + +#include "hw/core/qdev-properties.h" +#include "hw/core/qdev-properties-system.h" +#include "trace.h" + #define TYPE_USB_REDIR_SERVER "x-usb-redir-server" OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SERVER) =20 +#define USBREDIR_SERVER_VERSION "qemu " TYPE_USB_REDIR_SERVER " " QEMU_VER= SION + struct USBRedirServer { SysBusDevice parent_obj; =20 /* USB bus */ USBBus bus; USBPort port; + + /* Properties */ + CharFrontend cs; + + /* usbredir over the chardev */ + struct usbredirparser *parser; + QEMUBH *chardev_close_bh; + const uint8_t *read_buf; + int read_buf_size; + bool in_write; + guint watch; + bool host_connected; }; =20 /* @@ -94,6 +118,233 @@ static USBPortOps usbredir_server_port_ops =3D { static USBBusOps usbredir_server_bus_ops =3D { }; =20 +/* + * usbredirparser I/O and logging callbacks + */ + +static void usbredir_server_log(void *priv, int level, const char *msg) +{ + switch (level) { + case usbredirparser_error: + error_report(TYPE_USB_REDIR_SERVER ": %s", msg); + break; + case usbredirparser_warning: + warn_report(TYPE_USB_REDIR_SERVER ": %s", msg); + break; + default: + trace_usbredir_server_log(msg); + break; + } +} + +static int usbredir_server_read(void *priv, uint8_t *data, int count) +{ + USBRedirServer *s =3D priv; + + if (s->read_buf_size < count) { + count =3D s->read_buf_size; + } + + memcpy(data, s->read_buf, count); + + s->read_buf_size -=3D count; + if (s->read_buf_size) { + s->read_buf +=3D count; + } else { + s->read_buf =3D NULL; + } + + return count; +} + +static gboolean usbredir_server_write_unblocked(void *do_not_use, + GIOCondition cond, + void *opaque) +{ + USBRedirServer *s =3D opaque; + + s->watch =3D 0; + usbredirparser_do_write(s->parser); + + return G_SOURCE_REMOVE; +} + +static int usbredir_server_write(void *priv, uint8_t *data, int count) +{ + USBRedirServer *s =3D priv; + int ret; + + if (!qemu_chr_fe_backend_open(&s->cs)) { + return 0; + } + + /* + * Re-entry guard. The chain is: + * do_write() -> this -> qemu_chr_fe_write() -> chardev feeds us + * -> do_read() -> a callback -> do_write() again + * + * The second do_write() would walk the same buffer queue as the + * first. Returning 0 means "sent nothing", so the buffer stays for + * the outer one to send. + */ + if (s->in_write) { + trace_usbredir_server_write_recursion(); + return 0; + } + s->in_write =3D true; + + ret =3D qemu_chr_fe_write(&s->cs, data, count); + if (ret < count) { + if (!s->watch) { + s->watch =3D qemu_chr_fe_add_watch(&s->cs, G_IO_OUT | G_IO_HUP, + usbredir_server_write_unblock= ed, + s); + } + if (ret < 0) { + ret =3D 0; + } + } + + s->in_write =3D false; + + return ret; +} + +/* The remote host greets us once the socket is up. */ +static void usbredir_server_hello(void *priv, + struct usb_redir_hello_header *hello) +{ + USBRedirServer *s =3D priv; + + s->host_connected =3D true; +} + +/* + * Parser setup and teardown + */ + +static void usbredir_server_create_parser(USBRedirServer *s) +{ + uint32_t caps[USB_REDIR_CAPS_SIZE] =3D {}; + + s->parser =3D usbredirparser_create(); + if (!s->parser) { + error_report(TYPE_USB_REDIR_SERVER ": failed to create usbredirpar= ser"); + return; + } + + s->parser->priv =3D s; + s->parser->log_func =3D usbredir_server_log; + s->parser->read_func =3D usbredir_server_read; + s->parser->write_func =3D usbredir_server_write; + + /* Callbacks for messages the remote host sends to us */ + s->parser->hello_func =3D usbredir_server_hello; + + /* Capabilities: 64-bit IDs, connect_device_version, ep_info sizes */ + usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version= ); + usbredirparser_caps_set_cap(caps, usb_redir_cap_ep_info_max_packet_siz= e); + usbredirparser_caps_set_cap(caps, usb_redir_cap_64bits_ids); + + /* + * In USB the host is the side that starts every transfer; a device + * only answers. The exported device sits on our bus and we issue + * its transfers, so for that device we are the host. That is what + * fl_usb_host means, and why the side that exports a device sets it. + * + * The other QEMU does not drive the device, it receives it. In this + * protocol that makes it the client, and redirect.c leaves the flag + * clear. + * + * Without it the library refuses to send device_connect. + */ + usbredirparser_init(s->parser, USBREDIR_SERVER_VERSION, + caps, USB_REDIR_CAPS_SIZE, + usbredirparser_fl_usb_host); + usbredirparser_do_write(s->parser); +} + +static void usbredir_server_destroy_parser(USBRedirServer *s) +{ + s->host_connected =3D false; + + g_clear_handle_id(&s->watch, g_source_remove); + + if (s->parser) { + usbredirparser_destroy(s->parser); + s->parser =3D NULL; + } +} + +static void usbredir_server_chardev_close_bh(void *opaque) +{ + usbredir_server_destroy_parser(opaque); +} + +/* + * chardev callbacks + */ + +static int usbredir_server_chardev_can_read(void *opaque) +{ + USBRedirServer *s =3D opaque; + + if (!s->parser) { + return 0; + } + /* usbredirparser_do_read() consumes everything we hand it */ + return 1 * MiB; +} + +static void usbredir_server_chardev_read(void *opaque, const uint8_t *buf, + int size) +{ + USBRedirServer *s =3D opaque; + + if (!s->parser) { + return; + } + + /* No recursion allowed */ + assert(s->read_buf =3D=3D NULL); + + s->read_buf =3D buf; + s->read_buf_size =3D size; + + usbredirparser_do_read(s->parser); + /* do_read() ran our callbacks; flush whatever replies they queued */ + usbredirparser_do_write(s->parser); +} + +static void usbredir_server_chardev_event(void *opaque, + QEMUChrEvent event) +{ + USBRedirServer *s =3D opaque; + + switch (event) { + case CHR_EVENT_OPENED: + trace_usbredir_server_chardev_open(); + /* + * A close event only schedules chardev_close_bh. If it has not + * run yet, it would destroy the parser we are about to create, + * so run it now and cancel it. + */ + usbredir_server_chardev_close_bh(s); + qemu_bh_cancel(s->chardev_close_bh); + usbredir_server_create_parser(s); + break; + case CHR_EVENT_CLOSED: + trace_usbredir_server_chardev_close(); + qemu_bh_schedule(s->chardev_close_bh); + break; + case CHR_EVENT_BREAK: + case CHR_EVENT_MUX_IN: + case CHR_EVENT_MUX_OUT: + case CHR_EVENT_RESIZE: + break; + } +} + /* * Device registration */ @@ -102,14 +353,46 @@ static void usbredir_server_realize(DeviceState *dev,= Error **errp) { USBRedirServer *s =3D USB_REDIR_SERVER(dev); =20 + if (!qemu_chr_fe_backend_connected(&s->cs)) { + error_setg(errp, + TYPE_USB_REDIR_SERVER ": 'chardev' property must be set= "); + return; + } + /* One port: usbredir carries a single device. */ usb_bus_new(&s->bus, sizeof(s->bus), &usbredir_server_bus_ops, dev); s->bus.auto_hub =3D false; usb_register_port(&s->bus, &s->port, s, 0, &usbredir_server_port_ops, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL | USB_SPEED_MASK_HIGH); + + s->chardev_close_bh =3D qemu_bh_new_guarded(usbredir_server_chardev_cl= ose_bh, + s, &dev->mem_reentrancy_guar= d); + + qemu_chr_fe_set_handlers(&s->cs, + usbredir_server_chardev_can_read, + usbredir_server_chardev_read, + usbredir_server_chardev_event, + NULL, s, NULL, true); +} + +static void usbredir_server_unrealize(DeviceState *dev) +{ + USBRedirServer *s =3D USB_REDIR_SERVER(dev); + + qemu_chr_fe_deinit(&s->cs, true); + usbredir_server_destroy_parser(s); + + if (s->chardev_close_bh) { + qemu_bh_delete(s->chardev_close_bh); + s->chardev_close_bh =3D NULL; + } } =20 +static const Property usbredir_server_props[] =3D { + DEFINE_PROP_CHR("chardev", USBRedirServer, cs), +}; + /* * The link to the remote host is a chardev, and we cannot migrate * that. So this device cannot be migrated either. @@ -125,8 +408,10 @@ static void usbredir_server_class_init(ObjectClass *kl= ass, const void *data) =20 dc->desc =3D "USB Redirection Server"; dc->realize =3D usbredir_server_realize; + dc->unrealize =3D usbredir_server_unrealize; dc->vmsd =3D &vmstate_usbredir_server; set_bit(DEVICE_CATEGORY_USB, dc->categories); + device_class_set_props(dc, usbredir_server_props); } =20 static const TypeInfo usbredir_server_types[] =3D { diff --git a/hw/usb/trace-events b/hw/usb/trace-events index 80ead23358..d141661673 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -393,3 +393,9 @@ aspeed_udc_handle_data(int ep_nr, const char *dir, uint= 32_t iov, int ep_idx) "ep aspeed_udc_ep_data_in(unsigned ep, uint32_t rptr, uint32_t wptr, uint32_t = iov) "ep %u, rptr %u, wptr %u, iov %u" aspeed_udc_ep_data_out(unsigned ep, uint32_t wptr, uint32_t avail, uint32_= t iov) "ep %u, wptr %u, avail %u, iov %u" aspeed_udc_ep_ack(unsigned ep) "ep %u" + +# redirect-server.c +usbredir_server_chardev_open(void) "chardev opened" +usbredir_server_chardev_close(void) "chardev closed" +usbredir_server_write_recursion(void) "recursive write, leaving it queued" +usbredir_server_log(const char *msg) "%s" --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611559; cv=pass; d=zohomail.com; s=zohoarc; b=PHzKJaeLO5gcQP6omaf2oybOYaYPDn/6ogPMoUKxQs9nJshtFA+btA5vn+pm68kxDuWZ+Yg0LUeOIHHlahlkybifrAIs/YX6lgDVne8ufUYz0n+GHjCf5LyijJ+0iVQ7bLlp7ZYl5JA0vj2qb/sD9iIy6Ry4+axwPOzuA75KwHE= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611559; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=pfiFEH0CPSP8FOE1AeNeCKARq0aAKEWFbvucorbqrbQ=; b=a0F028Q/La546kZwDfIrS9pVuwJ/ysoFP8IocCIHnL0DVDy6RVddIoRy2mutlTcjiELz76e7iLxfnhbq1/O2dKQxRx2pnnIrp+NOkd1YwipDVkKerdGJqm98ussa2nTTYBWIdeeuAOga78ute9ZSO+5yoKx9/9UPN9K+TfSnctw= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1793611559636268.41312549868155; Mon, 2 Nov 2026 01:25:59 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGH-0007at-BF; Mon, 02 Nov 2026 04:23:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFR-0007MF-42; Mon, 02 Nov 2026 04:22:41 -0500 Received: from mail-koreacentralazlp170130006.outbound.protection.outlook.com ([2a01:111:f403:c40f::6] helo=SEYPR02CU001.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFN-0000Z0-DC; Mon, 02 Nov 2026 04:22:36 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by KUXPR06MB8030.apcprd06.prod.outlook.com (2603:1096:d10:4d::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:27 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:25 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iBhgURZC4kAlutZz6m376WyDbffd1PhJAbcoWqvE1efQIKuuTeABhcCrQrhie4X75R3SokFaqrGiGpGMPPD3embmDPioIAnK21p/Y0qXLn6kty2ou6yRRahnrtPxZIaOOzJKndx6Sbg3PqgIccIhT5ATIXicwx/49n5l3zdRyry2PP9uLiGQkop8GRNgwt3QH6UHlH3zTnh+q6f0DUhZdNf2a2BSUiUqu81NFJVCNDw+XIj9mwhrKc69IEApjAaPueieyUwfyM4mi8oPkicWaD6wagTMN4zWIAhwFejvHqALgIXi2dHX+OlWB+qOL69ZUdq9Rv/EMX3qFD5kgozLmQ== 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=pfiFEH0CPSP8FOE1AeNeCKARq0aAKEWFbvucorbqrbQ=; b=Rp1AlIgBGwL7It4Jm2FWRupfKBPTFYXZR/B9c1k5nzs62du6vYDvvihQRZyVkbQfwkpvNEUe36ElbZQz85FoU1g91EXPPgqvPygu5xjKrJNZu+nw7tNBaWq8EgXEcw0TuFnaGTEau6u/TJgEzuSSQrY57j2UR7WQjGawhzhOkhShZpTienBGHB4xaO+bMLcgFg1wCfMNCSYhIaBPR8oiUtqr7X+XJ0I3anZn2bZkyGSd1g0cP3HokCqVvpaDHjp17S91coDWihMICabjIq85jhMWMfFU6HlUDYgTPHx4P3y/3zKSHxj9w94n8AlJRhAfuonJYka+32SevxjKaFK6Gw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pfiFEH0CPSP8FOE1AeNeCKARq0aAKEWFbvucorbqrbQ=; b=rMyMiXHfB7MrUMak+lD8qqtmUraSv0kiYGByrQbmTsYJyL0OXX7rNh2MVHcTLONQoLCqAQ0uY3RCt3wPoao+/hv6zPVWVmrlFZDmuufWKFBoE6mTvhITlQh8vUcGD/j8TjawSy1me+2V0Cqj7ywldRwMrUJXVomcGMsY1J8h+VikdhLLVJZrMHLx6FNKZxPxhhC5cjQgWxXQygfo2QFgs5p5np6DamIhsH1ZI5xc7dQ1cBFzWLFkfh7d+zri/YEZl2s+67KAjSZednaXqfVtI0auaYJvRjHbC86AWXEjo9B8LxHsc85vh8zvIKmUY8apblmbxGxuPPJ8WjuuHIZriw== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 13/18] hw/usb/redirect-server: Announce the exported device Thread-Topic: [PATCH v8 13/18] hw/usb/redirect-server: Announce the exported device Thread-Index: AQHdaqupvmzo6sFN+0K1iqt887RtJA== Date: Mon, 2 Nov 2026 09:22:21 +0000 Message-ID: <20261102092201.1729245-14-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|KUXPR06MB8030:EE_ x-ms-office365-filtering-correlation-id: 195a2571-f597-46b4-1310-08df38c2cea8 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|366016|1800799024|23010399003|376014|7416014|921020|38070700021|261021123027099003|5023799004|56012099006|261009223027099003|261028144727099003|261021121427099003|261022075727099003|261026121527099003|261022105027099003|261026140227099003|10067099003|18002099003|22082099003|6133799003|3023799007; x-microsoft-antispam-message-info: wDAyTwNva6DwCxBJQzw+YeNiKbHcjUTYttq9nb6aFUpgLhTCzOJvyeaofpHxTTSC6KkEn28ZgvNAi8DMxr3QX2PdOSFmnvdbMnJ1KAh8fL3XkHXN4Z0ZzjKbtuy/e/pHsaLEo+0kqwhLYWJbYR9k3aFKcMzWv/3vZh24x/aIv/4r09nyGgXUXExZFlpqa5dUuQKZZlvMUqUFv1AD4AVKnU7+CZOKO86EuwaZSwjP2s8fGFNzjamdBR8qfjcLzdV+bABSE2LMKfyeXrCcFyFfuNjI1Qd/FFTin3DszRvVdpnBUEA2cI1Mq4m7PTuAkEHDsDT1EwsiIx3dxXaLIlMUk6gdYppy8ppShBy9VitLm8Qqwu5aivb4BzUJQwZnUhwMzqqZTGY/k2vZqr0HaT9az/PfDwQbf6ru3EZUkdB0xmZVy86s5H4QwKlaDIpeaWGD6PBr5v/rBVICqlkYtCNdbmuWIXTSPMMmnHpKCLOnsQBTHPeTd4n8tuD1Rlhj6ed3AQoacPYP3G1L/FMp/q5hmLM7L6x51NDj5V3M4no+RiCuH23rgqm60sFdlDEzNlkwGN+0gKpC+xvAKQ9/pLNC39s1kzNyCnspOeMkOSskdCldBT1jb4OYNmpCylelztEcgYHbljTmD0ZcjPGpTqYgJqGhoB4qSm5gMd9W5P7DBFoxaNW6eR3Zfm1IiUGZBp5s2pxR34Dq3EEQr2YBovr+4Iv++BQEqqBj+V0iSKOIPM3Jh+kdvZaTJXG8NOzYsTU/ x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(1800799024)(23010399003)(376014)(7416014)(921020)(38070700021)(261021123027099003)(5023799004)(56012099006)(261009223027099003)(261028144727099003)(261021121427099003)(261022075727099003)(261026121527099003)(261022105027099003)(261026140227099003)(10067099003)(18002099003)(22082099003)(6133799003)(3023799007); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?KkIVq+EXHyJqp5857ge1GF5I3PTcyvr3CCxRM4Qn/UpTgvuzzY7TovRbNC?= =?iso-8859-1?Q?N/w9581x7juD6UhXlJgYVAEg+RfOthypuNg+GW5ea8WPp6KbK3xsZ5zPf1?= =?iso-8859-1?Q?lWUl3nCaF8j1rKqocWvFs15z8MUSc22294j35fHP/xEJxnviOUZJuO3mEy?= =?iso-8859-1?Q?ki058vhF4OoGuZsrVf1yiwVf6j3qVeMDLfbTg7lmho/huIJjC98FW8uXD9?= =?iso-8859-1?Q?WVaFRc469ucyqjJj/1k0XkB2G8e7rkHWny0qyZPRyfWYB2EWwC6muEkaNy?= =?iso-8859-1?Q?RJDwAsf0wSouVWeoBc5lVURp0wrOPVqdCJv9plooABu5zmFSYfvwm4ECyY?= =?iso-8859-1?Q?JYQrjSciXREfOuSnEKBOBpTxtDJyBzs6Vcrpo34ON+xe6gQp2hkME5alGj?= =?iso-8859-1?Q?q9nJmCCw3+rCHmv1C50savYlQqxKVScTFSibqKjgbw5sKGPdKOCoQIukg9?= =?iso-8859-1?Q?4CthbeVQ42mUBxqA7TPKGuFYXZFz1ieBTsqxLh5+2fZ5JSrI8txf+jDeyN?= =?iso-8859-1?Q?i8686aQEHSAK1qSwPIgmg3wGkGQuKbrO0BLBTr9/BQoG4sAcAFrL6pyynT?= =?iso-8859-1?Q?ufO/JgGhX7wh3lmT4y5bS/VWPYFTLrJRbT7g4jvDWDugAFd0Yuenytv5/e?= =?iso-8859-1?Q?sGzCr+Aw4eriGzx/IoRFkt16J9MF3GJK7yV4ITz2s39j0ZVuKlVYqAZQAB?= =?iso-8859-1?Q?tuPySxxL5aaO8e24bsWPKdcxSGJjOpka8sknMrf7aWByeZN4ICYZmQrZTj?= =?iso-8859-1?Q?LW2/LbTkj+WLBgrlJ//xS9MbV4Uqqj6YxIntA2/q/q05WLlNztalSxX8R/?= =?iso-8859-1?Q?85uFgRZ3GWbbPKasQR750ogSz9ND9knencmK1b8a+aVzbedTufD5u5Dbxp?= =?iso-8859-1?Q?YrHSfnc+CdPu8/8QkRpWAfwl9iEjExFW7vj8xMu2WhcExLNCh5O2V/vafx?= =?iso-8859-1?Q?Rtor4x76DuJ2I9AtQIarM84RU16Z55L2OCokJYHN1V1GqSK8TTzZtq4Jrb?= =?iso-8859-1?Q?i5q+8IqfDTEaedNiQd7auXVjwW/2RktmWdgGmNAPauH2HRAAapRKBIFcEW?= =?iso-8859-1?Q?Q/PvePO3nR0SdHYUtP7k52x71wfDp9FNjSYxOXZuI2p4ANdDXVJ1C6bblg?= =?iso-8859-1?Q?zBnLxK+/8wLbQzRILZoPZJbiwegviORurT1iuAFW6OIIIKrVxo0hEVhQ1Z?= =?iso-8859-1?Q?+HGL623CtyCZ957zbnhXmeuOEPoAhgQmU/75fq+0BErsvDrhf5L5+TMcly?= =?iso-8859-1?Q?op1JPvqR6gyDuyEfxHteApF3NH4xJ390uOzTCC8hKgbpb9WVT9OnFDwLgu?= =?iso-8859-1?Q?Eak0DRfaZZ0kvMkZrMeqGvlqfj3yUbNsYRjSLyKdhaUA5uEtjN8YsE9FH4?= =?iso-8859-1?Q?d8wDBfY8En6TPnzn2u1gnG6sPv/H/Fq+PAW6g2VEwFv1zFVCPngf3yFpAh?= =?iso-8859-1?Q?nl4yP+DjhTK9wN4tRQb9Qoy1xsbp2TsFBqenaFcuW/g5pL8yVLSZZM/Q3B?= =?iso-8859-1?Q?ePQJtdRnGya+5zV3P6393fa1TyG2PRwgO+u6mnrjXzxlpFzDBD1jaHGzZz?= =?iso-8859-1?Q?bbPKxp3JKrkh6awJuDqhVCNB9ae2f9IHDbfMuCtPxxmFVojTdBM+s3tJWZ?= =?iso-8859-1?Q?dBrg9n1h2SCuF9yZ8q1aGmFqmX/fIzfb49wfU/kK7o4WSI9pz4Q2rr1fIO?= =?iso-8859-1?Q?XbCowXtFU4Su7CLO0ztwzr5kM3Gs5exuwRjfmD1SuK93vZ/GrsTpRiSb+K?= =?iso-8859-1?Q?Zi9idgHJkmFCl6jfVFdX2XOZ4o4mKb2FDbQtEmJfMV+56HCBSDhzNWZvqJ?= =?iso-8859-1?Q?kvyIqhu/og=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: qsP9p1ljG1UE1r99d0im4nKl4p/Qvy/l1ApljjSibs6KnOpODYDFZ6NOH0bt0MS+7SvGB0MwlSuXNxLmoRDPal7TbPTiHLS8kbaoU2MTl52B01ZJisLx4I3sdoI7nM9/ldYKEqSY7a3xwqKunC2A21ogb84xfuAhLDKXY46gFPxKuq2Li9xRyhDmHGCN99mxNROlelte0NpqeeNYsyTK0e/2UVN3b5k3f27gs+zbh+HzQhrPEeNFWbtO8ccChvmDu706d2iGinz0yxnIn81leGqyRTXNwNUJVddrZVW009sr7ziWmY3nGZ4Y4Ovpx9W/LHJdpYln/a5GIngg+gAKHQ== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 195a2571-f597-46b4-1310-08df38c2cea8 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:21.4883 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: b54wC7bu3cteuWn1OpHw3APZahIsl5W8trMfjcOg9p2tMyRE/jd7M+YEQmv+YfCIBteRfmPT5UPrvrx+bNBqmtItwAV02GXbgCpIFLeEqxA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: KUXPR06MB8030 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c40f::6; envelope-from=jamin_lin@aspeedtech.com; helo=SEYPR02CU001.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611561361158500 Content-Type: text/plain; charset="utf-8" Send device_connect when a device is attached and the host has greeted us, device_disconnect when it goes away, and handle the bus reset the host sends before enumerating. device_connect carries no identity. The peer asks the device itself with GET_DESCRIPTOR as soon as it enumerates, so anything we put there would be made up. The speed is real: it comes from the device on our port. Signed-off-by: Jamin Lin --- hw/usb/redirect-server.c | 150 ++++++++++++++++++++++++++++++++++++++- hw/usb/trace-events | 7 ++ 2 files changed, 156 insertions(+), 1 deletion(-) diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index f78351bde9..e207f5a7eb 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -56,6 +56,7 @@ #include "qemu/main-loop.h" #include "qemu/module.h" #include "migration/vmstate.h" +#include "qemu/cutils.h" #include "hw/core/sysbus.h" #include "hw/usb/usb.h" #include "chardev/char-fe.h" @@ -85,17 +86,105 @@ struct USBRedirServer { /* usbredir over the chardev */ struct usbredirparser *parser; QEMUBH *chardev_close_bh; + QEMUBH *announce_bh; const uint8_t *read_buf; int read_buf_size; bool in_write; guint watch; bool host_connected; + bool device_announced; }; =20 +/* + * The device is whatever USBDevice the user plugged into our port with + * "-device ,bus=3D.0". NULL until then. + */ +static USBDevice *usbredir_server_device(USBRedirServer *s) +{ + return s->port.dev; +} + +/* + * Device announcement + */ + +static uint8_t usbredir_server_speed(USBDevice *device) +{ + switch (device->speed) { + case USB_SPEED_LOW: + return usb_redir_speed_low; + case USB_SPEED_FULL: + return usb_redir_speed_full; + default: + return usb_redir_speed_high; + } +} + +static void usbredir_server_announce_device(void *opaque) +{ + USBRedirServer *s =3D opaque; + USBDevice *device =3D usbredir_server_device(s); + struct usb_redir_interface_info_header iface_info =3D { + .interface_count =3D 0, + }; + struct usb_redir_device_connect_header conn =3D {}; + + if (!s->host_connected || s->device_announced || + !device || !device->attached) { + return; + } + s->device_announced =3D true; + conn.speed =3D usbredir_server_speed(device); + + /* + * The device has to be in DEFAULT state before it can answer + * anything, so reset it here. + */ + usb_device_reset(device); + + /* Send this before device_connect. The peer needs it to accept us. */ + usbredirparser_send_interface_info(s->parser, &iface_info); + usbredirparser_do_write(s->parser); + + trace_usbredir_server_announce(conn.speed); + usbredirparser_send_device_connect(s->parser, &conn); + usbredirparser_do_write(s->parser); +} + /* * USB port ops */ =20 +static void usbredir_server_port_attach(USBPort *port) +{ + USBRedirServer *s =3D port->opaque; + + trace_usbredir_server_attach(); + + /* + * usb_attach() sets the state to ATTACHED after this returns. + * A device needs DEFAULT state before it can serve a request. + * The BH runs after usb_attach(), so the device stays in DEFAULT. + */ + qemu_bh_schedule(s->announce_bh); +} + +static void usbredir_server_port_detach(USBPort *port) +{ + USBRedirServer *s =3D port->opaque; + + trace_usbredir_server_detach(s->device_announced); + + qemu_bh_cancel(s->announce_bh); + + if (s->host_connected && s->parser && s->device_announced) { + trace_usbredir_server_disconnect(); + usbredirparser_send_device_disconnect(s->parser); + usbredirparser_do_write(s->parser); + } + s->device_announced =3D false; +} + static void usbredir_server_port_child_detach(USBPort *port, USBDevice *ch= ild) { /* We only export the device on our own port. Nothing to do. */ @@ -107,6 +196,8 @@ static void usbredir_server_port_wakeup(USBPort *port) } =20 static USBPortOps usbredir_server_port_ops =3D { + .attach =3D usbredir_server_port_attach, + .detach =3D usbredir_server_port_detach, .child_detach =3D usbredir_server_port_child_detach, .wakeup =3D usbredir_server_port_wakeup, }; @@ -210,13 +301,53 @@ static int usbredir_server_write(void *priv, uint8_t = *data, int count) return ret; } =20 -/* The remote host greets us once the socket is up. */ +/* + * usbredirparser message callbacks + */ + static void usbredir_server_hello(void *priv, struct usb_redir_hello_header *hello) { USBRedirServer *s =3D priv; + char version[sizeof(hello->version) + 1]; + + pstrcpy(version, sizeof(version), hello->version); + trace_usbredir_server_hello(version); =20 s->host_connected =3D true; + qemu_bh_schedule(s->announce_bh); +} + +static void usbredir_server_reset(void *priv) +{ + USBRedirServer *s =3D priv; + USBDevice *device =3D usbredir_server_device(s); + + trace_usbredir_server_bus_reset(device && device->attached); + usb_device_reset(device); +} + +static void usbredir_server_filter_reject(void *priv) +{ + trace_usbredir_server_filter_reject(); +} + +static void usbredir_server_filter_filter(void *priv, + struct usbredirfilter_rule *rules, int rules_count) +{ + /* We accept any host. The callback owns the rules, so free them. */ + free(rules); +} + +static void usbredir_server_device_disconnect_ack(void *priv) +{ + /* The host saw our device_disconnect. Nothing to do. */ +} + +static void usbredir_server_interface_info(void *priv, + struct usb_redir_interface_info_header *hdr) +{ + /* The host should not send this to a device. Nothing to do. */ } =20 /* @@ -240,6 +371,14 @@ static void usbredir_server_create_parser(USBRedirServ= er *s) =20 /* Callbacks for messages the remote host sends to us */ s->parser->hello_func =3D usbredir_server_hello; + s->parser->reset_func =3D usbredir_server_reset; + + /* The parser calls these directly, so they must not be NULL. */ + s->parser->filter_reject_func =3D usbredir_server_filter_reject; + s->parser->filter_filter_func =3D usbredir_server_filter_filter; + s->parser->device_disconnect_ack_func =3D + usbredir_server_device_disconnect_ack; + s->parser->interface_info_func =3D usbredir_server_interface_info; =20 /* Capabilities: 64-bit IDs, connect_device_version, ep_info sizes */ usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version= ); @@ -267,7 +406,9 @@ static void usbredir_server_create_parser(USBRedirServe= r *s) static void usbredir_server_destroy_parser(USBRedirServer *s) { s->host_connected =3D false; + s->device_announced =3D false; =20 + qemu_bh_cancel(s->announce_bh); g_clear_handle_id(&s->watch, g_source_remove); =20 if (s->parser) { @@ -368,6 +509,8 @@ static void usbredir_server_realize(DeviceState *dev, E= rror **errp) =20 s->chardev_close_bh =3D qemu_bh_new_guarded(usbredir_server_chardev_cl= ose_bh, s, &dev->mem_reentrancy_guar= d); + s->announce_bh =3D qemu_bh_new_guarded(usbredir_server_announce_device= , s, + &dev->mem_reentrancy_guard); =20 qemu_chr_fe_set_handlers(&s->cs, usbredir_server_chardev_can_read, @@ -387,6 +530,11 @@ static void usbredir_server_unrealize(DeviceState *dev) qemu_bh_delete(s->chardev_close_bh); s->chardev_close_bh =3D NULL; } + + if (s->announce_bh) { + qemu_bh_delete(s->announce_bh); + s->announce_bh =3D NULL; + } } =20 static const Property usbredir_server_props[] =3D { diff --git a/hw/usb/trace-events b/hw/usb/trace-events index d141661673..2cc6a244b9 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -399,3 +399,10 @@ usbredir_server_chardev_open(void) "chardev opened" usbredir_server_chardev_close(void) "chardev closed" usbredir_server_write_recursion(void) "recursive write, leaving it queued" usbredir_server_log(const char *msg) "%s" +usbredir_server_hello(const char *version) "peer is %s" +usbredir_server_attach(void) "device attached" +usbredir_server_detach(bool announced) "device detached, was announced %d" +usbredir_server_announce(uint8_t speed) "device_connect speed %u" +usbredir_server_disconnect(void) "device_disconnect sent" +usbredir_server_bus_reset(bool attached) "bus reset, attached %d" +usbredir_server_filter_reject(void) "host rejected our device" --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611525; cv=pass; d=zohomail.com; s=zohoarc; b=W19rVD4n/ro2wzoxyJfhN11eAcl7lLRNNxXVfCvu+w7VIDKt0c+C39E7JOXxPavRgzKtrw4wj1d+GhbacJGC+5dBZI37URjOFBQmOVCCoWs9LQaCBaq6susPy9oTb3tjSsjk7tGZbivlroFCKtEHrTFOmehU2AAm82g0wxmtLtU= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611525; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=exLkX8H4fGpbqCwt9jjNuQExHPekR56Qs3ZX1JPW854=; b=O4vW2BPjIuuoCJ8XZZbNnc4Xdz7tSVKS+smSEgpc/SAHfF1ifXzT875FQU6egKT45Pxty61s97UBWJwDIZwQBGKo2N7i0vifkJXeChZs1nBdHP6OJ8QQQRCe/HkpCi2GXgOUUs2GW1IxxQfxdXP0wOEMQUOGbwNVA+2rUlEOj8c= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1793611525137777.6660944609525; Mon, 2 Nov 2026 01:25:25 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1467868.1676971 (Exim 4.92) (envelope-from ) id 1xNoHc-0005SU-TM; Mon, 02 Nov 2026 09:24:52 +0000 Received: by outflank-mailman (output) from mailman id 1467868.1676971; Mon, 02 Nov 2026 09:24:52 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoHc-0005PS-IO; Mon, 02 Nov 2026 09:24:52 +0000 Received: by outflank-mailman (input) for mailman id 1467868; Mon, 02 Nov 2026 09:22:34 +0000 Received: from mx.expurgate.net ([194.145.224.20]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1xNoFO-0003UH-Hz for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 09:22:34 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1xNoFN-0071w6-Ue for xen-devel@lists.xenproject.org; Mon, 02 Nov 2026 10:22:33 +0100 Received: from [10.42.69.9] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 6ae85653-8faa-0a2a0a5109dd-0a2a45098784-44 for ; Mon, 02 Nov 2026 10:22:33 +0100 Received: from [52.101.127.134] (helo=TYDPR03CU002.outbound.protection.outlook.com) by tlsNG-bad1c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from ) id 6ae85656-be1a-0a2a45090019-34657f86192f-3 for ; Mon, 02 Nov 2026 10:22:33 +0100 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5265.apcprd06.prod.outlook.com (2603:1096:4:1e4::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:28 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:28 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=aspeedtech.com header.i="@aspeedtech.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vbBDUxjPYk4FZEUfjuvDWclP4/c7vWsZ7Y3ONkb5HIltLuG5pbSc3rZeaMZ6Qpwslsflh175xtBFeaB1cBCM0pZ3HAzZD1gZnBOTPzgHryoPyi5EvjTsbk0+2bS6JOX6ulE7Qz6/akeKTIVGUmFBAqcL+OsjaerqvDQdKfviQijRzFIi7udyEpAoyL8w4Z/S6TMHXHfteO5visdve/ChWOeq2s+/sCGMaZWayzzj5Mb6EiTSuwgETEysGNlCkbk8WPDF8xeJGIrqEVVru1+FK824gHkAmfAL256IqFFX8HrqIAtuhoKPHM05E0y8Xo6CYFBMA3f/mik6pHowLXpgDQ== 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=exLkX8H4fGpbqCwt9jjNuQExHPekR56Qs3ZX1JPW854=; b=ahjeHWZvR8saddEFG+vC6oAhgPDn+eCEMC+DHntimYSL4QT7ssIhHlM8uiygRZxF2Hoq3kyWcMFpstqa7JipoLfUWnu0ux+p4bCYzi62gE0OFCSo5LND9yzNZ/KArjF9MxvmeAJMuxmBLN1jnmJAvnfkJbAuXyKj7fs9iRKcy2WKuLYuyoDXGLR26T+pwSui6j5UABp4WX4LBLSGVqQ6GXVgb8vQ31ALyk9dDHP/KkeJmzdZU/+u9qO4ikPBS7IUa5gFKu+SrWgYPio8yyJgtjJsHlwEoQLIgnp6tXuOg97hJKNugPZxLgemppX89jKFtHyE/0KCIEYDXl/Q5Fu8JA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=exLkX8H4fGpbqCwt9jjNuQExHPekR56Qs3ZX1JPW854=; b=iqnJU13b6atU1p7SJpN052LB3JX2WjwGVJ0w/Cm2VcMnwcCWTBnCYAIeHViJVE/aRzioEE2BB23plijOMFHg1uplQ5KcGQQ8mHk6ARstpJruk2Wq7nkTbjUC88qEDLg/ISdLdGI9+mNdW+OJ4LNhvzmV4FS9PPtMMPsXGMRBglDKXTBlN3/wAT+yMFO5G+BR8qIptNtzgu33tfMPEfWbx6YMaoMsgy2VKaScv/JBnkwQLOEyf7XEZXDqzRRLp3EKbFsSqKKFyE8vEOkNccez6bv0eUdP6UcSBjvhb3MG92CLPxYRJhUEm37zwZus1g+qf6GpKoUmlPlwGxBGG7tHJw== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 14/18] hw/usb/redirect-server: Implement control transfers Thread-Topic: [PATCH v8 14/18] hw/usb/redirect-server: Implement control transfers Thread-Index: AQHdaquqR4kcpf7BW0WY0PXfmYQ09A== Date: Mon, 2 Nov 2026 09:22:23 +0000 Message-ID: <20261102092201.1729245-15-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|SI2PR06MB5265:EE_ x-ms-office365-filtering-correlation-id: 407bc151-97b6-4222-3408-08df38c2d086 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|23010399003|366016|6133799003|10067099003|18002099003|22082099003|921020|38070700021|56012099006|5023799004|261021123027099003|261021121427099003|261021135927099003|261026135527099003|261022105027099003|261026140227099003|261022113327099003|261026121527099003|261026130827099003|261022115727099003|261022075727099003|261009223027099003|261009221227099003|261021133027099003|261028144727099003|261021130227099003; x-microsoft-antispam-message-info: sUNE+eYpCe33Gex+K983JFfxFMP1TgSeq7f0nAfkf3Wm+4wr9PdYH2cgFGEWwhGJ4Ocp2yMmIJr0SUkLfZ4fbduiKYh20NdS07a6TXMbTY36O91vBgzyJ5gworVujR9nn72YNBsHw6NHNtsg0cKye6flj1ZVR1lyueLa59sy0bTY+d2RhsW8eQGXfgPSB9NRsZtuxPqsP/su0g4/M1NYSlm1qPqD2pNZ4c7r5WkL6M5fJKmYOUKF3Cs0tOrZVmcepi/Zu1ebxbkZclOpiNoTN2nwjeI4bPly6gfkdeapYI/tDEN9pT0sK5mPdV1NKnbkqmjk9vKwRPw4TBsaiiKfZcBLThKESkT8af2BgCDizFcLy3Gg5x8S+z03enMqgusb1nL3gJl94oGHSWJjKXNu975ILgOvCjBnbws8jJQPEBfnqZhjny+WWVBrluh07Q4fsUllnY5jMUJjRXjitMCFqerHMMiA9QoyaSvjsb9CWi3a2RCY4Xd8CuPPncVWvjXtGSLCBu+V0DoLgrqLlr7JGgFeziyLoGszr9B/qb023+40Zm54CgI4dDNa5LV7QuO+IJ2uecjA286Kwx9aiDiEeRIBmXJtGra6kn43D0wzLoQk698eHxt1QFEIyF1Xe9sOqrsWTgnImizp0welgtAGiJ9FAWFR1pOdYzOtFPoiWIfldqnojttL7adFM4BXD5CwZZ3QU0qMJrxFBdWKP+9ddcAzgfOW5TI66pmZ+n+HOLMQRTNJVG69eig3gHeGVfRA x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEZPR06MB7362.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(366016)(6133799003)(10067099003)(18002099003)(22082099003)(921020)(38070700021)(56012099006)(5023799004)(261021123027099003)(261021121427099003)(261021135927099003)(261026135527099003)(261022105027099003)(261026140227099003)(261022113327099003)(261026121527099003)(261026130827099003)(261022115727099003)(261022075727099003)(261009223027099003)(261009221227099003)(261021133027099003)(261028144727099003)(261021130227099003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?8qDUsVCSa7fzyioBjv4a1JlMOX0rE3qOUZzsMC4HEi9pc7G0PZC2TESIeE?= =?iso-8859-1?Q?nvcEWM+7y/RGz5/QUpDd2tMwY9BTTX9IuIyIxJ/scXWV1k3yIAYhMHSUK0?= =?iso-8859-1?Q?C8UVO2YHVft+K1sO9ytqflVF+dlNR4TjvdSGJ5CbfAYDFJAogDzcAJ/4w+?= =?iso-8859-1?Q?R861R0P7INHHV2EpmlgZydEVKF6bvG6n7dQ3XuuN+wIztVTbhjg3PCI+R9?= =?iso-8859-1?Q?W2pzZa5uLVmtOaONdM6f4XTjjaTAHW7+moDc4Wd8q9O5Rk1/ooTJsFzKMn?= =?iso-8859-1?Q?KQN1sSTT5oXg03HiL2/EEJ5OEcGRKJcTEeASulJDBo48EM7j+PlwVpR839?= =?iso-8859-1?Q?9rL5NVSIAyJ9/DfRjm+LaxoILqjkYfkChN7A3gnh7Lz05veoHdmRfO8q2N?= =?iso-8859-1?Q?SvPUa1/7gpFitdAW3xXKt0RdgV2xTD3TM/NLz/LPMsIR/xriOZka/yZOZx?= =?iso-8859-1?Q?dVXXcMbUrk3OZt0QLbHj/u5PVkADbQVQ3i1gDWNqG9Sqt6MZET4mkrNRno?= =?iso-8859-1?Q?hPOLBaxP0rtAV7HPF5l5LnSBNKGg1qHo1jwPWiRuhIlh0+3J03ZyCjbOpw?= =?iso-8859-1?Q?2T9uiMp9mRsRzdEk3CPpSVK2V5nukjNduraoz6DCKIBu3lls4mmzNfgvbN?= =?iso-8859-1?Q?LF06vuKon0bvjizfL8mYwDY3dkkYSJrxgsHPlD1UHUOWf40uDxqhC14KFg?= =?iso-8859-1?Q?6wq8nWKC6d0AW/KD946MkAFqerPfUCnZ5oA3URgRqHQnBVN3sYLFtxIbCR?= =?iso-8859-1?Q?23SycDOaSVCdsc8Mo7vcySb7dhYDxFpUWyGtimQlff8Y4mBBz5ArV14peG?= =?iso-8859-1?Q?5sIBA/ASEbdtWuZ0HUfn3L584ACQuA7bmR9bzGmmNImjzD46Jg9DQ8/elL?= =?iso-8859-1?Q?LxFALhfXE/PoJI3oWkFmGZOc91TI8B4Yed/55XKsG/yBk0VwufO0gTlJyy?= =?iso-8859-1?Q?c6l78lqOSyVKPGNr8PZI3KOb5yqQfqVuvbsR4Rq7dizJ6ad26LrzyxZ2s5?= =?iso-8859-1?Q?tfXDGtBJHAEKapTZclboU/uIaX0+EWkgnwa5FIigWJuzNm/FYEZ0ap5+F2?= =?iso-8859-1?Q?AFuXTGER18sroa+ubPZkB6oM9/7Jg0wD04awAavpfAs2ScRRDgPfrUCqIA?= =?iso-8859-1?Q?xZ+guARoNUJmexPA2kW+ieLv5HkFJAzspuRRyRPOahEX3AAxBQPgPpDpjR?= =?iso-8859-1?Q?hpIRgL+aei8oQKO0fgPD8gV+I9YHDOfaik/yB82kP1ZCOYQfTkSFSPzJXQ?= =?iso-8859-1?Q?yPtzmbCGxkz+5MjlMu1tLe8fvDitNL48ZkxKlL48/6wi25fymCiOwLuL9C?= =?iso-8859-1?Q?u1mX47ou1k/tpzri/Xh1yh0lLaLa8qguxPaGQXQ68U8eAvZhCkK9FW5YGB?= =?iso-8859-1?Q?n+lUKcguPEmYspY/7SrVROVMC5P4Ko8bSaLOmHWMiERong4Bc8cijgwi7f?= =?iso-8859-1?Q?8zoJACpiZmRQNGU/Xeyvbb1OGGHnZvFZ1LcyFkPfMj2b8hqNhAPA8WBDfn?= =?iso-8859-1?Q?fk17RuAuJW+kJMXLSjFpSSGN3fn8Jgy/y1zQzxUSj+th7Xdlb7NWvincMH?= =?iso-8859-1?Q?Tx7jE6n0d3XiJGkJjKcAeKxFKwYL48+5DrcfHd3Xq0OYakoCDi/5yBhATV?= =?iso-8859-1?Q?WGP2XnG1Zh3xS0LFV5Zntknoq0k/zMRP4Ij+Tg4omYZFcCf0rOzIrUie0R?= =?iso-8859-1?Q?7BUWUD6EqoveHbYQ2vo+GDhtUWHHaAASovuhI31wKnS8/nzfrKGIrJwbQQ?= =?iso-8859-1?Q?PcUKaIp+/Q/IQPKmZLhZmqAdnaaLHtwMCewHX0jguwcH5EUzq636ry6Olw?= =?iso-8859-1?Q?pY1R2j2ckg=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: Cg0EHwm0RA7Y/eC+34uRNNM5YhcXxnE6UoeM7pj4p1qb5wf30m77+zL3pgAIFFpD3680TxM3UsgjNAogJ8j5rWqe+wZ4b5V10CItWeDV4Jo9v+ar+/zrZGFC/D/ZobNaakJPJ5dCoHRc3od1MkdS8qgo1QeuEPsqPNDd0cTJmdUDe9jOUj/QYtJxye8oja2SGBV7j/y+DA1hQTwfkRZBKcR7AQlq/Mrmc/2jjor5oQBCK+HgqCbxWyA9jGM7fFdGrO1+FtIROB//Rdq76AalVqi2zYfCvij9zoFPbPnKGKXSB3Hx13wYaZHjef4SRYb3V4fpMfgnDV6kO5R/BgkUdg== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 407bc151-97b6-4222-3408-08df38c2d086 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:23.1856 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 7f1Xh0qaKKd5KVu03/ShuUf1DtWcjC54/L3cAFMavnbISXawNoT5kVmQ58/hI74NkrrlatLwe+/vCwUSigUlTaCPI9pfv5WfISj2MYAyfbw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5265 X-purgate-ID: tlsNG-bad1c0/1793611353-BC8C9034-FAAEDC3E/0/0 X-purgate-type: clean X-purgate-size: 41475 X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611527798154100 Content-Type: text/plain; charset="utf-8" A usbredir control_packet carries a whole control transfer, so hand it to the device as one packet with the eight setup bytes in USBPacket::parameter. The device may answer later, so we have to remember the packets we sent. Each one stays on a list until it comes back. We drop the whole list on a bus reset or a chardev close. When the host asks us to cancel a packet, we answer it and drop it. If it is no longer on the list we already answered it, so we send nothing. A device can answer USB_RET_NAK, which means the endpoint has nothing right now, not that the transfer failed. Keep the request and send it again when the device wakes the endpoint. Not every device wakes it, so a timer asks again as well. Every request is checked before we act on it, and one we turn away is still answered, so the host never waits for ever. usbredir has its own messages for set_configuration, get_configuration, set_alt_setting and get_alt_setting. Each one is a control transfer, so run it like one and send back the status message. usbredir wants an ep_info message. It says what kind each endpoint is, how big its packets are and which interface it belongs to. QEMU cannot tell us. It only knows after it has read the device's descriptors, and it never reads them for a device that just forwards transfers. So we read them ourselves: the configuration descriptor passes through us on its way to the host. A device can offer several configurations, and an interface several alternate settings, each with its own endpoints. Keep every configuration descriptor, build the table from the one the host selected, and send a fresh ep_info when that selection changes, so ep_info never describes an endpoint that is not there. Signed-off-by: Jamin Lin --- hw/usb/redirect-server.c | 811 ++++++++++++++++++++++++++++++++++++++- hw/usb/trace-events | 11 + 2 files changed, 821 insertions(+), 1 deletion(-) diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index e207f5a7eb..55a1f79623 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -56,6 +56,7 @@ #include "qemu/main-loop.h" #include "qemu/module.h" #include "migration/vmstate.h" +#include "qemu/timer.h" #include "qemu/cutils.h" #include "hw/core/sysbus.h" #include "hw/usb/usb.h" @@ -63,9 +64,11 @@ #include "qom/object.h" =20 #include +#include =20 #include "hw/core/qdev-properties.h" #include "hw/core/qdev-properties-system.h" +#include "desc.h" #include "trace.h" =20 #define TYPE_USB_REDIR_SERVER "x-usb-redir-server" @@ -73,6 +76,83 @@ OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SER= VER) =20 #define USBREDIR_SERVER_VERSION "qemu " TYPE_USB_REDIR_SERVER " " QEMU_VER= SION =20 +/* + * The usbredir ep_info message has one slot per endpoint and direction. + * Index 0-15 are the OUT endpoints, 16-31 the IN ones. + */ +#define USBREDIR_SERVER_MAX_EP 32 +#define USBREDIR_SERVER_EP_IN_BASE 16 + +/* + * Ask again this often after an endpoint answered NAK. Most devices + * wake the endpoint when data arrives, and then we ask at once. This + * timer is for the devices that do not. + */ +#define USBREDIR_SERVER_RETRY_MS 1000 + +#define USBREDIR_SERVER_CTRL 0 + +/* Which message answers the host when a control transfer ends. */ +typedef enum { + USBREDIR_SERVER_REPLY_CONTROL, + USBREDIR_SERVER_REPLY_CONFIG, + USBREDIR_SERVER_REPLY_ALT, +} USBRedirServerReply; + +/* What the device said when usbredir_server_ask_device() asked it. */ +typedef enum { + /* It took the request and will call back. */ + USBREDIR_SERVER_ASK_ASYNC, + /* It has nothing now, so the request went back on the list. */ + USBREDIR_SERVER_ASK_NAK, + /* It answered, and the request is freed. */ + USBREDIR_SERVER_ASK_COMPLETE, +} USBRedirServerAsk; + +typedef struct USBRedirServerPkt { + USBPacket pkt; + + /* Kept for the usbredir response. */ + struct usb_redir_control_packet_header ctrl_hdr; + + /* + * The IOV points here. IN data lands in it, OUT data is copied in. + * Allocated and freed with the packet. + */ + uint8_t *data; + + /* Every request is on this list. */ + QTAILQ_ENTRY(USBRedirServerPkt) inflight_link; + + /* Only a request that must wait is on this list. */ + QTAILQ_ENTRY(USBRedirServerPkt) waiting_link; + + USBRedirServerReply reply; + uint64_t redir_id; + int ep_idx; + int type; +} USBRedirServerPkt; + +typedef struct USBRedirServerEp { + USBRedirServer *s; + + /* + * Requests the device has not taken, oldest first. A new request + * goes on the end. We always ask about the first one, and a NAK + * puts it back on the front, so the order never changes. + */ + QTAILQ_HEAD(, USBRedirServerPkt) waiting; + + /* Asks again for a device that does not wake the endpoint. */ + QEMUTimer *retry; + + uint16_t max_packet; + uint8_t interval; + uint8_t iface; + uint8_t type; + uint8_t idx; +} USBRedirServerEp; + struct USBRedirServer { SysBusDevice parent_obj; =20 @@ -93,8 +173,22 @@ struct USBRedirServer { guint watch; bool host_connected; bool device_announced; + + /* Every request the host is still waiting for an answer to. */ + QTAILQ_HEAD(, USBRedirServerPkt) inflight; + uint64_t next_id; + + USBRedirServerEp ep[USBREDIR_SERVER_MAX_EP]; + uint8_t alt_setting[USB_MAX_INTERFACES]; + GHashTable *config_descs; + uint8_t config_value; }; =20 +static void usbredir_server_pkt_free(USBRedirServer *s, USBRedirServerPkt = *rp); +static void usbredir_server_stop_transfers(USBRedirServer *s); +static void usbredir_server_send_cancelled(USBRedirServer *s, + USBRedirServerPkt *rp); + /* * The device is whatever USBDevice the user plugged into our port with * "-device ,bus=3D.0". NULL until then. @@ -105,9 +199,212 @@ static USBDevice *usbredir_server_device(USBRedirServ= er *s) } =20 /* - * Device announcement + * Descriptor snooping and device announcement */ =20 +static int usbredir_server_ep_index(uint8_t addr) +{ + int ep_nr =3D addr & 0x0f; + + return (addr & USB_DIR_IN) ? ep_nr + USBREDIR_SERVER_EP_IN_BASE : ep_n= r; +} + +static void usbredir_server_clear_ep_table(USBRedirServer *s) +{ + int i; + + for (i =3D 0; i < USBREDIR_SERVER_MAX_EP; i++) { + s->ep[i].max_packet =3D 0; + s->ep[i].interval =3D 0; + s->ep[i].iface =3D 0; + s->ep[i].type =3D USB_ENDPOINT_XFER_INVALID; + } +} + +static uint8_t usbredir_server_ep_status(USBRedirServer *s, uint8_t addr, + uint8_t want_type) +{ + bool is_ctrl =3D want_type =3D=3D USB_ENDPOINT_XFER_CONTROL; + USBDevice *device =3D usbredir_server_device(s); + int idx =3D usbredir_server_ep_index(addr); + int ep_nr =3D addr & 0x0f; + + if (!s->host_connected || !device || !device->attached) { + return usb_redir_ioerror; + } + + /* Endpoint 0 carries control transfers, and nothing else. */ + if (ep_nr =3D=3D 0 && !is_ctrl) { + return usb_redir_inval; + } + + /* An absent endpoint has type INVALID, which never matches. */ + if (!is_ctrl && s->ep[idx].type !=3D want_type) { + return usb_redir_inval; + } + + return usb_redir_success; +} + +static void usbredir_server_record_endpoint(USBRedirServer *s, + const USBDescriptor *desc, + uint8_t iface) +{ + uint8_t addr; + int ep_nr; + int idx; + + addr =3D desc->u.endpoint.bEndpointAddress; + ep_nr =3D addr & 0x0f; + idx =3D usbredir_server_ep_index(addr); + if (ep_nr < 1 || idx >=3D USBREDIR_SERVER_MAX_EP) { + trace_usbredir_server_endpoint_dropped(addr); + return; + } + + s->ep[idx].type =3D desc->u.endpoint.bmAttributes & 0x03; + s->ep[idx].max_packet =3D (desc->u.endpoint.wMaxPacketSize_hi << 8) | + desc->u.endpoint.wMaxPacketSize_lo; + s->ep[idx].interval =3D desc->u.endpoint.bInterval; + s->ep[idx].iface =3D iface; + + /* + * bInterval says how often to poll this endpoint. Pass on what the + * descriptor said, but never 0 for an interrupt or isochronous + * endpoint: redirect.c throws the whole device away when it sees 0, + * so store 1 instead. + */ + if (s->ep[idx].interval =3D=3D 0 && + (s->ep[idx].type =3D=3D USB_ENDPOINT_XFER_INT || + s->ep[idx].type =3D=3D USB_ENDPOINT_XFER_ISOC)) { + s->ep[idx].interval =3D 1; + } +} + +static void usbredir_server_save_config_desc(USBRedirServer *s, + const uint8_t *data, int len) +{ + const USBDescriptor *conf =3D (const USBDescriptor *)data; + uint16_t total; + + if (len < 4) { + return; + } + total =3D lduw_le_p(data + 2); + + /* + * The host reads this twice. The first read is a few bytes, just to + * learn the length from wTotalLength. The second read has the whole + * descriptor. + * + * A configuration descriptor is 9 bytes, so a shorter one is broken. + */ + if (total < 9 || len < total) { + return; + } + + g_hash_table_insert(s->config_descs, + GUINT_TO_POINTER(conf->u.config.bConfigurationValu= e), + g_memdup2(data, total)); +} + +/* + * Some devices only forward transfers. They never read their own + * descriptors, so the USB core leaves their endpoint types at + * USB_ENDPOINT_XFER_INVALID. Sending that in ep_info does not work: the + * host sees type 255 and will not move data. So read the configuration + * descriptor and fill the tables here. + * + * Only what the host selected counts. A device can offer several + * configurations, and an interface several alternate settings. The + * endpoints of the ones not chosen are not there. + */ +static void usbredir_server_build_ep_table(USBRedirServer *s) +{ + const USBDescriptor *desc; + const uint8_t *config; + bool active =3D false; + uint8_t iface =3D 0; + uint8_t alt; + int i =3D 0; + int total; + + usbredir_server_clear_ep_table(s); + + config =3D g_hash_table_lookup(s->config_descs, + GUINT_TO_POINTER(s->config_value)); + if (!config) { + trace_usbredir_server_config_not_found( + s->config_value, g_hash_table_size(s->config_descs)); + return; + } + total =3D lduw_le_p(config + 2); + + while (i + 2 <=3D total) { + desc =3D (const USBDescriptor *)(config + i); + + if (desc->bLength < 2) { + trace_usbredir_server_bad_descriptor(i, desc->bLength, + desc->bDescriptorType); + break; + } + if (i + desc->bLength > total) { + trace_usbredir_server_descriptor_overrun(i, desc->bLength, tot= al); + break; + } + + switch (desc->bDescriptorType) { + case USB_DT_INTERFACE: + if (desc->bLength < 9) { + trace_usbredir_server_bad_descriptor(i, desc->bLength, + desc->bDescriptorType= ); + break; + } + iface =3D desc->u.interface.bInterfaceNumber; + alt =3D desc->u.interface.bAlternateSetting; + active =3D iface < USB_MAX_INTERFACES && + alt =3D=3D s->alt_setting[iface]; + break; + case USB_DT_ENDPOINT: + if (desc->bLength < 7) { + trace_usbredir_server_bad_descriptor(i, desc->bLength, + desc->bDescriptorType= ); + break; + } + if (active) { + usbredir_server_record_endpoint(s, desc, iface); + } + break; + } + + i +=3D desc->bLength; + } +} + +static void usbredir_server_send_ep_info(USBRedirServer *s) +{ + struct usb_redir_ep_info_header ep_info =3D {}; + int i; + + usbredir_server_build_ep_table(s); + + for (i =3D 0; i < USBREDIR_SERVER_MAX_EP; i++) { + ep_info.type[i] =3D s->ep[i].type; + ep_info.max_packet_size[i] =3D s->ep[i].max_packet; + ep_info.interface[i] =3D s->ep[i].iface; + ep_info.interval[i] =3D s->ep[i].interval; + if (s->ep[i].type !=3D USB_ENDPOINT_XFER_INVALID) { + trace_usbredir_server_ep_info(i, ep_info.type[i], + ep_info.max_packet_size[i], + ep_info.interval[i], + ep_info.interface[i]); + } + } + + usbredirparser_send_ep_info(s->parser, &ep_info); + usbredirparser_do_write(s->parser); +} + static uint8_t usbredir_server_speed(USBDevice *device) { switch (device->speed) { @@ -149,6 +446,107 @@ static void usbredir_server_announce_device(void *opa= que) trace_usbredir_server_announce(conn.speed); usbredirparser_send_device_connect(s->parser, &conn); usbredirparser_do_write(s->parser); + + usbredir_server_send_ep_info(s); +} + +/* + * Packet completion + */ + +static uint8_t usbredir_server_status(int status) +{ + switch (status) { + case USB_RET_SUCCESS: + return usb_redir_success; + case USB_RET_STALL: + return usb_redir_stall; + case USB_RET_BABBLE: + return usb_redir_babble; + default: + return usb_redir_ioerror; + } +} + +static void usbredir_server_ctrl_reply(USBRedirServer *s, uint64_t id, + const struct usb_redir_control_packet_header *hdr, + USBRedirServerReply reply, uint8_t status, uint8_t *data, int actual) +{ + struct usb_redir_configuration_status_header cfg =3D {}; + struct usb_redir_control_packet_header resp =3D *hdr; + struct usb_redir_alt_setting_status_header alt =3D { + .interface =3D hdr->index, + }; + bool is_in =3D !!(hdr->requesttype & USB_DIR_IN); + int data_len; + + switch (reply) { + case USBREDIR_SERVER_REPLY_CONTROL: + data_len =3D is_in ? actual : 0; + resp.status =3D status; + /* Both directions report how much the device moved. */ + resp.length =3D actual; + usbredirparser_send_control_packet(s->parser, id, &resp, + data_len > 0 ? data : NULL, + data_len); + break; + case USBREDIR_SERVER_REPLY_CONFIG: + cfg.status =3D status; + /* IN reports what the device sent, OUT echoes what the host chose= . */ + cfg.configuration =3D is_in ? (actual > 0 ? data[0] : 0) : hdr->va= lue; + usbredirparser_send_configuration_status(s->parser, id, &cfg); + break; + case USBREDIR_SERVER_REPLY_ALT: + alt.status =3D status; + /* IN reports what the device sent, OUT echoes what the host chose= . */ + alt.alt =3D is_in ? (actual > 0 ? data[0] : 0) : hdr->value; + usbredirparser_send_alt_setting_status(s->parser, id, &alt); + break; + } + usbredirparser_do_write(s->parser); +} + +/* + * The device answered the control transfer. Some requests change the + * endpoint list, so save what the host asked for. + */ +static void usbredir_server_ctrl_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + uint8_t status =3D usbredir_server_status(rp->pkt.status); + int actual =3D rp->pkt.actual_length; + + trace_usbredir_server_ctrl_complete(rp->redir_id, status, actual); + usbredir_server_ctrl_reply(s, rp->redir_id, &rp->ctrl_hdr, rp->reply, + status, rp->data, actual); + + if (status !=3D usb_redir_success) { + return; + } + + switch ((rp->ctrl_hdr.requesttype << 8) | rp->ctrl_hdr.request) { + case DeviceRequest | USB_REQ_GET_DESCRIPTOR: + /* Keep the configuration descriptor. It says what endpoints exist= . */ + if ((rp->ctrl_hdr.value >> 8) =3D=3D USB_DT_CONFIG && actual > 0) { + usbredir_server_save_config_desc(s, rp->data, actual); + } + break; + case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: + /* A new configuration puts every interface back on alternate 0. */ + s->config_value =3D rp->ctrl_hdr.value; + memset(s->alt_setting, 0, sizeof(s->alt_setting)); + usbredir_server_send_ep_info(s); + break; + case InterfaceOutRequest | USB_REQ_SET_INTERFACE: + if (rp->ctrl_hdr.index >=3D USB_MAX_INTERFACES) { + return; + } + s->alt_setting[rp->ctrl_hdr.index] =3D rp->ctrl_hdr.value; + usbredir_server_send_ep_info(s); + break; + default: + break; + } } =20 /* @@ -176,6 +574,7 @@ static void usbredir_server_port_detach(USBPort *port) trace_usbredir_server_detach(s->device_announced); =20 qemu_bh_cancel(s->announce_bh); + usbredir_server_stop_transfers(s); =20 if (s->host_connected && s->parser && s->device_announced) { trace_usbredir_server_disconnect(); @@ -183,6 +582,12 @@ static void usbredir_server_port_detach(USBPort *port) usbredirparser_do_write(s->parser); } s->device_announced =3D false; + + /* Clear the endpoint table: it belongs to the device that is leaving.= */ + usbredir_server_clear_ep_table(s); + memset(s->alt_setting, 0, sizeof(s->alt_setting)); + g_hash_table_remove_all(s->config_descs); + s->config_value =3D 0; } =20 static void usbredir_server_port_child_detach(USBPort *port, USBDevice *ch= ild) @@ -195,20 +600,170 @@ static void usbredir_server_port_wakeup(USBPort *por= t) /* We do not pass remote wakeup to the host. Nothing to do. */ } =20 +/* + * The core calls this for a packet the device answered with + * USB_RET_ASYNC. usbredir_server_ask_device() calls it for the rest. + */ +static void usbredir_server_packet_complete(USBPort *port, USBPacket *p) +{ + USBRedirServer *s =3D port->opaque; + USBRedirServerPkt *rp =3D container_of(p, USBRedirServerPkt, pkt); + USBDevice *device =3D usbredir_server_device(s); + + /* A cancel can arrive while we answer, so it must not find this one. = */ + QTAILQ_REMOVE(&s->inflight, rp, inflight_link); + + if (!s->parser || !device) { + usbredir_server_pkt_free(s, rp); + return; + } + + switch (rp->type) { + case USBREDIR_SERVER_CTRL: + usbredir_server_ctrl_complete(s, rp); + break; + default: + g_assert_not_reached(); + } + + usbredir_server_pkt_free(s, rp); +} + static USBPortOps usbredir_server_port_ops =3D { .attach =3D usbredir_server_port_attach, .detach =3D usbredir_server_port_detach, .child_detach =3D usbredir_server_port_child_detach, .wakeup =3D usbredir_server_port_wakeup, + .complete =3D usbredir_server_packet_complete, }; =20 /* * USB bus ops */ =20 +/* + * Hand one request to the device. USB_RET_ASYNC means it answers + * later, and the core then calls usbredir_server_packet_complete() + * for us. A NAK means it has nothing yet, so keep the request. + * Anything else is the answer, and the core calls nothing, so we call + * usbredir_server_packet_complete() ourselves. + */ +static USBRedirServerAsk usbredir_server_ask_device(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + USBRedirServerEp *ep =3D &s->ep[rp->ep_idx]; + + usb_handle_packet(usbredir_server_device(s), &rp->pkt); + + if (rp->pkt.status =3D=3D USB_RET_ASYNC) { + return USBREDIR_SERVER_ASK_ASYNC; + } + + /* + * Keep the request and send it again when the device wakes the + * endpoint. + */ + if (rp->pkt.status =3D=3D USB_RET_NAK) { + trace_usbredir_server_nak_park(rp->redir_id, rp->ep_idx); + QTAILQ_INSERT_HEAD(&ep->waiting, rp, waiting_link); + timer_mod(ep->retry, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + + (int64_t)USBREDIR_SERVER_RETRY_MS * SCALE_MS); + return USBREDIR_SERVER_ASK_NAK; + } + + usbredir_server_packet_complete(&s->port, &rp->pkt); + return USBREDIR_SERVER_ASK_COMPLETE; +} + +/* + * Send everything this endpoint is holding, oldest first. The device + * answering NAK stops it again, and the next wakeup or the timer picks + * it up. + */ +static void usbredir_server_kick_ep(USBRedirServer *s, int idx) +{ + USBRedirServerEp *ep =3D &s->ep[idx]; + USBRedirServerPkt *rp; + + /* We are asking now, so drop the timer. A new NAK sets it again. */ + timer_del(ep->retry); + + while ((rp =3D QTAILQ_FIRST(&ep->waiting)) !=3D NULL) { + QTAILQ_REMOVE(&ep->waiting, rp, waiting_link); + trace_usbredir_server_nak_retry(rp->redir_id, idx); + if (usbredir_server_ask_device(s, rp) =3D=3D USBREDIR_SERVER_ASK_N= AK) { + return; + } + } +} + +static void usbredir_server_retry_ep(void *opaque) +{ + USBRedirServerEp *ep =3D opaque; + + usbredir_server_kick_ep(ep->s, ep->idx); +} + +static void usbredir_server_wakeup_ep(USBBus *bus, USBEndpoint *ep, + unsigned int stream) +{ + USBRedirServer *s =3D container_of(bus, USBRedirServer, bus); + uint8_t addr =3D ep->nr | (ep->pid =3D=3D USB_TOKEN_IN ? USB_DIR_IN : = 0); + + usbredir_server_kick_ep(s, usbredir_server_ep_index(addr)); +} + static USBBusOps usbredir_server_bus_ops =3D { + .wakeup_endpoint =3D usbredir_server_wakeup_ep, }; =20 +/* An endpoint answers in order, so this waits behind anything else. */ +static void usbredir_server_submit(USBRedirServer *s, USBRedirServerPkt *r= p) +{ + USBRedirServerEp *ep =3D &s->ep[rp->ep_idx]; + + QTAILQ_INSERT_TAIL(&s->inflight, rp, inflight_link); + if (!QTAILQ_EMPTY(&ep->waiting)) { + QTAILQ_INSERT_TAIL(&ep->waiting, rp, waiting_link); + return; + } + usbredir_server_ask_device(s, rp); +} + +static USBRedirServerPkt *usbredir_server_pkt_alloc(int size, int ep_idx) +{ + USBRedirServerPkt *rp =3D g_new0(USBRedirServerPkt, 1); + + qemu_iovec_init(&rp->pkt.iov, 1); + rp->data =3D g_malloc0(size); + rp->ep_idx =3D ep_idx; + return rp; +} + +/* + * Take @rp off every list and free it. Do not use usb_packet_complete(): + * it calls back into usbredir_server_packet_complete(), which would free + * the request a second time. usb_cancel_packet() only tells the device + * to let go. + */ +static void usbredir_server_pkt_free(USBRedirServer *s, USBRedirServerPkt = *rp) +{ + USBRedirServerEp *ep =3D &s->ep[rp->ep_idx]; + + if (QTAILQ_IN_USE(rp, waiting_link)) { + QTAILQ_REMOVE(&ep->waiting, rp, waiting_link); + } + if (QTAILQ_IN_USE(rp, inflight_link)) { + QTAILQ_REMOVE(&s->inflight, rp, inflight_link); + } + if (usb_packet_is_inflight(&rp->pkt)) { + usb_cancel_packet(&rp->pkt); + } + usb_packet_cleanup(&rp->pkt); + g_free(rp->data); + g_free(rp); +} + /* * usbredirparser I/O and logging callbacks */ @@ -324,9 +879,160 @@ static void usbredir_server_reset(void *priv) USBDevice *device =3D usbredir_server_device(s); =20 trace_usbredir_server_bus_reset(device && device->attached); + if (!device || !device->attached) { + return; + } + + usbredir_server_stop_transfers(s); usb_device_reset(device); } =20 +/* + * Run one control transfer on the device. @reply says which message + * answers the host when the transfer finishes. + */ +static void usbredir_server_do_control(USBRedirServer *s, uint64_t id, + struct usb_redir_control_packet_header *hdr, + uint8_t *data, int data_len, USBRedirServerReply reply) +{ + USBDevice *device =3D usbredir_server_device(s); + USBRedirServerPkt *rp; + USBEndpoint *ep0; + uint8_t status; + bool is_in; + int size; + + trace_usbredir_server_control(id, hdr->requesttype, hdr->request, + hdr->value, hdr->index, hdr->length); + + /* The host still waits for an answer, even when there is nobody to as= k. */ + status =3D usbredir_server_ep_status(s, 0, USB_ENDPOINT_XFER_CONTROL); + if (status !=3D usb_redir_success) { + trace_usbredir_server_ctrl_refused(id, status); + usbredir_server_ctrl_reply(s, id, hdr, reply, status, NULL, 0); + return; + } + + is_in =3D !!(hdr->requesttype & USB_DIR_IN); + ep0 =3D usb_ep_get(device, USB_TOKEN_SETUP, 0); + + /* Room for the data of either direction. */ + size =3D MAX(hdr->length, data_len); + + rp =3D usbredir_server_pkt_alloc(size, 0); + rp->redir_id =3D id; + rp->reply =3D reply; + rp->ctrl_hdr =3D *hdr; + rp->type =3D USBREDIR_SERVER_CTRL; + if (!is_in && data_len > 0) { + memcpy(rp->data, data, data_len); + } + + usb_packet_setup(&rp->pkt, is_in ? USB_TOKEN_IN : USB_TOKEN_OUT, ep0, + 0, s->next_id++, false, false); + if (hdr->length > 0) { + usb_packet_addbuf(&rp->pkt, rp->data, hdr->length); + } + + rp->pkt.parameter =3D (uint64_t)hdr->requesttype | + (uint64_t)hdr->request << 8 | + (uint64_t)hdr->value << 16 | + (uint64_t)hdr->index << 32 | + (uint64_t)hdr->length << 48; + + usbredir_server_submit(s, rp); +} + +static void usbredir_server_control_packet(void *priv, uint64_t id, + struct usb_redir_control_packet_header *hdr, + uint8_t *data, int data_len) +{ + USBRedirServer *s =3D priv; + + usbredir_server_do_control(s, id, hdr, data, data_len, + USBREDIR_SERVER_REPLY_CONTROL); + usbredirparser_free_packet_data(s->parser, data); +} + +static void usbredir_server_set_configuration(void *priv, uint64_t id, + struct usb_redir_set_configuration_header *hdr) +{ + struct usb_redir_control_packet_header ctrl =3D { + .endpoint =3D 0, + .request =3D USB_REQ_SET_CONFIGURATION, + /* Host->Device, Standard, Device */ + .requesttype =3D 0x00, + .status =3D 0, + .value =3D hdr->configuration, + .index =3D 0, + .length =3D 0, + }; + USBRedirServer *s =3D priv; + + /* The host gets a configuration_status when the device answers. */ + usbredir_server_do_control(s, id, &ctrl, NULL, 0, + USBREDIR_SERVER_REPLY_CONFIG); +} + +static void usbredir_server_get_configuration(void *priv, uint64_t id) +{ + struct usb_redir_control_packet_header ctrl =3D { + .endpoint =3D 0, + .request =3D USB_REQ_GET_CONFIGURATION, + /* Device->Host, Standard, Device */ + .requesttype =3D 0x80, + .status =3D 0, + .value =3D 0, + .index =3D 0, + .length =3D 1, + }; + USBRedirServer *s =3D priv; + + /* The host gets a configuration_status when the device answers. */ + usbredir_server_do_control(s, id, &ctrl, NULL, 0, + USBREDIR_SERVER_REPLY_CONFIG); +} + +static void usbredir_server_set_alt_setting(void *priv, uint64_t id, + struct usb_redir_set_alt_setting_header *hdr) +{ + struct usb_redir_control_packet_header ctrl =3D { + .endpoint =3D 0, + .request =3D USB_REQ_SET_INTERFACE, + /* Host->Device, Standard, Interface */ + .requesttype =3D 0x01, + .status =3D 0, + .value =3D hdr->alt, + .index =3D hdr->interface, + .length =3D 0, + }; + USBRedirServer *s =3D priv; + + /* The host gets an alt_setting_status when the device answers. */ + usbredir_server_do_control(s, id, &ctrl, NULL, 0, + USBREDIR_SERVER_REPLY_ALT); +} + +static void usbredir_server_get_alt_setting(void *priv, uint64_t id, + struct usb_redir_get_alt_setting_header *hdr) +{ + struct usb_redir_control_packet_header ctrl =3D { + .endpoint =3D 0, + .request =3D USB_REQ_GET_INTERFACE, + /* Device->Host, Standard, Interface */ + .requesttype =3D 0x81, + .status =3D 0, + .value =3D 0, + .index =3D hdr->interface, + .length =3D 1, + }; + USBRedirServer *s =3D priv; + + /* The host gets an alt_setting_status when the device answers. */ + usbredir_server_do_control(s, id, &ctrl, NULL, 0, + USBREDIR_SERVER_REPLY_ALT); +} + static void usbredir_server_filter_reject(void *priv) { trace_usbredir_server_filter_reject(); @@ -350,6 +1056,80 @@ static void usbredir_server_interface_info(void *priv, /* The host should not send this to a device. Nothing to do. */ } =20 +static void usbredir_server_cancel_data_packet(void *priv, uint64_t id) +{ + USBRedirServer *s =3D priv; + USBRedirServerPkt *rp; + int idx; + + QTAILQ_FOREACH(rp, &s->inflight, inflight_link) { + if (rp->redir_id =3D=3D id) { + idx =3D rp->ep_idx; + + trace_usbredir_server_cancel(id, true); + usbredir_server_send_cancelled(s, rp); + usbredir_server_pkt_free(s, rp); + + /* The rest were waiting behind this one, so send them now. */ + usbredir_server_kick_ep(s, idx); + return; + } + } + + /* + * Not on our list means we already answered it. The host uses the + * id to find the request, and the same id is used again later. A + * second answer could land on the wrong request. Send nothing. + */ + trace_usbredir_server_cancel(id, false); +} + +/* + * Cancelled and in-flight packets + */ + +/* + * Every request must get one answer carrying its id, even an aborted one. + * A dropped id stays in the host's cancelled queue. The host reuses ids, + * so a later answer would be thrown away as a stale one. + */ +static void usbredir_server_send_cancelled(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + struct usb_redir_control_packet_header ctrl; + + switch (rp->type) { + case USBREDIR_SERVER_CTRL: + ctrl =3D rp->ctrl_hdr; + ctrl.status =3D usb_redir_cancelled; + ctrl.length =3D 0; + usbredirparser_send_control_packet(s->parser, rp->redir_id, + &ctrl, NULL, 0); + break; + default: + return; + } + usbredirparser_do_write(s->parser); +} + +static void usbredir_server_stop_transfers(USBRedirServer *s) +{ + USBRedirServerPkt *rp; + int i; + + for (i =3D 0; i < USBREDIR_SERVER_MAX_EP; i++) { + timer_del(s->ep[i].retry); + } + + /* + * No "cancelled" response here. This runs on a bus reset, a detach or + * a closed chardev, and the host has dropped its own queues already. + */ + while ((rp =3D QTAILQ_FIRST(&s->inflight)) !=3D NULL) { + usbredir_server_pkt_free(s, rp); + } +} + /* * Parser setup and teardown */ @@ -372,13 +1152,19 @@ static void usbredir_server_create_parser(USBRedirSe= rver *s) /* Callbacks for messages the remote host sends to us */ s->parser->hello_func =3D usbredir_server_hello; s->parser->reset_func =3D usbredir_server_reset; + s->parser->control_packet_func =3D usbredir_server_control_packet; + s->parser->set_configuration_func =3D usbredir_server_set_configuratio= n; =20 /* The parser calls these directly, so they must not be NULL. */ + s->parser->get_configuration_func =3D usbredir_server_get_configuratio= n; + s->parser->set_alt_setting_func =3D usbredir_server_set_alt_setting; + s->parser->get_alt_setting_func =3D usbredir_server_get_alt_setting; s->parser->filter_reject_func =3D usbredir_server_filter_reject; s->parser->filter_filter_func =3D usbredir_server_filter_filter; s->parser->device_disconnect_ack_func =3D usbredir_server_device_disconnect_ack; s->parser->interface_info_func =3D usbredir_server_interface_info; + s->parser->cancel_data_packet_func =3D usbredir_server_cancel_data_pac= ket; =20 /* Capabilities: 64-bit IDs, connect_device_version, ep_info sizes */ usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version= ); @@ -411,6 +1197,8 @@ static void usbredir_server_destroy_parser(USBRedirSer= ver *s) qemu_bh_cancel(s->announce_bh); g_clear_handle_id(&s->watch, g_source_remove); =20 + usbredir_server_stop_transfers(s); + if (s->parser) { usbredirparser_destroy(s->parser); s->parser =3D NULL; @@ -493,6 +1281,7 @@ static void usbredir_server_chardev_event(void *opaque, static void usbredir_server_realize(DeviceState *dev, Error **errp) { USBRedirServer *s =3D USB_REDIR_SERVER(dev); + int i; =20 if (!qemu_chr_fe_backend_connected(&s->cs)) { error_setg(errp, @@ -500,6 +1289,18 @@ static void usbredir_server_realize(DeviceState *dev,= Error **errp) return; } =20 + QTAILQ_INIT(&s->inflight); + for (i =3D 0; i < USBREDIR_SERVER_MAX_EP; i++) { + QTAILQ_INIT(&s->ep[i].waiting); + s->ep[i].s =3D s; + s->ep[i].idx =3D i; + s->ep[i].retry =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, + usbredir_server_retry_ep, &s->ep[i]); + } + s->config_descs =3D g_hash_table_new_full(g_direct_hash, g_direct_equa= l, + NULL, g_free); + usbredir_server_clear_ep_table(s); + /* One port: usbredir carries a single device. */ usb_bus_new(&s->bus, sizeof(s->bus), &usbredir_server_bus_ops, dev); s->bus.auto_hub =3D false; @@ -522,10 +1323,13 @@ static void usbredir_server_realize(DeviceState *dev= , Error **errp) static void usbredir_server_unrealize(DeviceState *dev) { USBRedirServer *s =3D USB_REDIR_SERVER(dev); + int i; =20 qemu_chr_fe_deinit(&s->cs, true); usbredir_server_destroy_parser(s); =20 + g_clear_pointer(&s->config_descs, g_hash_table_destroy); + if (s->chardev_close_bh) { qemu_bh_delete(s->chardev_close_bh); s->chardev_close_bh =3D NULL; @@ -535,6 +1339,11 @@ static void usbredir_server_unrealize(DeviceState *de= v) qemu_bh_delete(s->announce_bh); s->announce_bh =3D NULL; } + + for (i =3D 0; i < USBREDIR_SERVER_MAX_EP; i++) { + timer_free(s->ep[i].retry); + s->ep[i].retry =3D NULL; + } } =20 static const Property usbredir_server_props[] =3D { diff --git a/hw/usb/trace-events b/hw/usb/trace-events index 2cc6a244b9..d63156a930 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -406,3 +406,14 @@ usbredir_server_announce(uint8_t speed) "device_connec= t speed %u" usbredir_server_disconnect(void) "device_disconnect sent" usbredir_server_bus_reset(bool attached) "bus reset, attached %d" usbredir_server_filter_reject(void) "host rejected our device" +usbredir_server_cancel(uint64_t id, bool found) "id %" PRIu64 " still in f= light %d" +usbredir_server_ep_info(unsigned idx, uint8_t type, uint16_t mps, uint8_t = interval, uint8_t iface) "ep_info[%u] type %u mps %u interval %u iface %u" +usbredir_server_config_not_found(uint8_t value, unsigned have) "no descrip= tor for configuration %u, we have %u" +usbredir_server_bad_descriptor(int offset, uint8_t length, uint8_t type) "= descriptor at byte %d is too short: bLength %u, type %u" +usbredir_server_descriptor_overrun(int offset, uint8_t length, int total) = "descriptor at byte %d runs past the end: bLength %u, total %d" +usbredir_server_endpoint_dropped(uint8_t address) "endpoint 0x%02x does no= t fit our tables" +usbredir_server_control(uint64_t id, uint8_t requesttype, uint8_t request,= uint16_t value, uint16_t index, uint16_t length) "id %" PRIu64 " type 0x%0= 2x request 0x%02x value 0x%04x index 0x%04x length %u" +usbredir_server_nak_park(uint64_t id, int ep) "id %" PRIu64 " ep %d" +usbredir_server_nak_retry(uint64_t id, int ep) "id %" PRIu64 " ep %d" +usbredir_server_ctrl_complete(uint64_t id, int status, int actual) "id %" = PRIu64 " status %d actual %d" +usbredir_server_ctrl_refused(uint64_t id, int status) "id %" PRIu64 " stat= us %d" --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611500; cv=pass; d=zohomail.com; s=zohoarc; b=KZSDn9BA7sx62PWgKLY0NvyFA2REybj4UjokLQtOwl7hhwR67GTM60AfXy95VgkiED54Ip1daY97VWu0OhGMwW/d6xuOBOGlcfwPyEVf/hi+1PaC4RcwW0cNxJxVCSG1JXXHAOx84r+Buwhgu/RnLlp+54w8kfd837BWRTo9900= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611500; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zLj2Owmud6dzaDoLDIP99lKup2W+/g/vdyQI4KPNKSE=; b=N/2c1gQ6iRXHkqFDURLs1PZC51SYF0tOLkSb873WKjDvIOEUjBvivBqK0BLDgarSqvwjPYszxbdABKVRrwWa9k/ZM1R1/yCiREsc8CYk3oMLigDuH5DaZeyPuP4a1/crFMtTzIDRRfukguhf4GhXiSHZ2+3XqmJ4qoo8SOyj6UE= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 179361150006776.59912251114281; Mon, 2 Nov 2026 01:25:00 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGH-0007be-LG; Mon, 02 Nov 2026 04:23:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFi-0007OM-C9; Mon, 02 Nov 2026 04:23:01 -0500 Received: from mail-japaneastazlp170130007.outbound.protection.outlook.com ([2a01:111:f403:c405::7] helo=TYDPR03CU002.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFP-0000ZW-Q8; Mon, 02 Nov 2026 04:22:39 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by KL1PR06MB6110.apcprd06.prod.outlook.com (2603:1096:820:d8::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:30 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:29 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tMkt6zXOXWZ9STLsjYPmZq2oqTvI5Yv9x2Ew3Zb/M6Myg07gQ2UrtOgnb0nE5T6Oi4sBczFa1vZO2n/LRUQnF7MUZ5pxxVPyzFsoekL7px7q/WkXSEtGtkUmy+jO7ZRcsfp3zPg2qL8DK0rnuwAcjBvEp4TECwOovUCuRfjiyXuNS1/19NkSvh5wZKAzxHqCo+DkC9xx0kfVLvN9z7s3CpKdsDama8i2NXkaMEWQ/Pvhb74YXGdrpnTmiqOu7UnNB8xjDSgXSTRMlVEzK+8xBMNR9wIgfBilUVC1k9ACtzA0qiJnt0Fvk71E4xXnl5cLz6i31ypvwNb41k/mt7lhZA== 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=zLj2Owmud6dzaDoLDIP99lKup2W+/g/vdyQI4KPNKSE=; b=IaRlO1ojuwbnIKd8aAvtwFUDtUDnYDn6cp6i/4gewptoCjsLmwoLyJtxJOmxkieIMjMCOoM94P7zSf2zpNipv616bbPqFc7DpRuss1v0aqFNSFrSoCDiVIpu7LkKHwQ7KYjJFWQ2OgY6rs41WJuERs0q1Idfc+uR+tq+TO4D9z+bWMRyTtEjMf4V1gxHAIP01RnHy1hlsdiXDaHDCuMp/veR78fPOZ1jxaNt/7294/GKzMHR29M7Hv0sGweJp6r3WOEmej2lTiHTt9b2KYJzD0FnzQ5VH16mBeulAKf9WYla3uJ2iAbI26ZQasD2hws9uLIlSgkYmJxy1vsfj+JUHw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zLj2Owmud6dzaDoLDIP99lKup2W+/g/vdyQI4KPNKSE=; b=MFRbz6qX4GmRSinnIy68eLtU2XGPqOHd4SWp2eOZT1L4OXCJzqJloOrpbD6jRKMMU+fgt7f/W89/BCZ4GXeyl21I/6VihoAhZQZxl/6MHvC3mqAR+UPxWsuS0g07TLsSlfR0Ki5e5K35vhGFQxqa1AJLowBUP0xC3MU5qiPoGzXCJR8klYk89r3mAcBeVqB67p8mYZGzyDrNpU4tg8f8NCBQGbcohAWGHHnluULGp/196rauJrHBnr9uUNtUyYE6OkTMFL/e7TeLG30tYM/qWx4oaHW8BQsqPiH9la467fo2nuFPMggtYneNdGMsKcp+k+aBi3IE7kxgQLBz7UVF1A== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 15/18] hw/usb/redirect-server: Implement bulk and interrupt transfers Thread-Topic: [PATCH v8 15/18] hw/usb/redirect-server: Implement bulk and interrupt transfers Thread-Index: AQHdaqurF85yHNDEXEKWX5f/X6p+yA== Date: Mon, 2 Nov 2026 09:22:24 +0000 Message-ID: <20261102092201.1729245-16-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|KL1PR06MB6110:EE_ x-ms-office365-filtering-correlation-id: 5ce4b888-b41a-443d-1531-08df38c2d0f5 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|23010399003|1800799024|366016|7416014|376014|921020|38070700021|261021135927099003|5023799004|56012099006|261009223027099003|261009221227099003|261028144727099003|261021121427099003|261021123027099003|261021133027099003|261021130227099003|261026135527099003|261026130827099003|261022115727099003|261022105027099003|261022113327099003|261026140227099003|261026121527099003|261022075727099003|10067099003|18002099003|22082099003|6133799003; x-microsoft-antispam-message-info: R5qJ1FDPt8ncC7fdwx1+bVVG37yfo/KX5YEZzdGmY1aa6UYAaN0XqGpDiKO0A6/apBOEaYJYQ3wTSB5hgyWjQSU6QymlVDy/tHrwCETTlKQHUEJUvpCbc3LVGyCcyOa0bXZbDX/pDAMCyEpbkGXf/nZo2kSb0w547XemDE1G5jteqBbpA5wlrbuPqfU6SwfZHsDecZIlXuRwZFyRuH/ORXgbQmtwuuQOT0AdHnSnW0ey3yxlys0l/sA4uT9xjgVokT8Hr3r6ML/TCs7/jDRUdy01u27EMyTbs5Tx0d3PGbf4CrC2TyuEVdha6s7miHbeVhXdNis7Vtolk20cc2DFvGioJ/KWV0w8GjrbJ6BCo+Cwh1VC/A/ciTHehNIw/hs8439Tve4LtqUHcp8WRfWuZ/Ey5LDRJ+rkMNGd//yaAXRMhhaHss+tpzwyoG6p6PGuY70NDeNsBTjEfG/qAD4Lentk4duGeD9EmzxflVv15z05qiF/iKYo7c98m9WAY6PdKsIUBUd2SOVNlTlXpdE+wmlFRObcc81luDE1bJjx87rkm+wOIGyjzWGvsK2psGvt/GFeIqQCFo+ZGY7MKkuFW/58rZUFz6sq4YZvJRy3d4KwO/MBE/6cwHknVdl7yV/wmi79nTckrowdfARMmShtoFzzrqvKt7pzhzBa6AGz87g+Ax9+klqc2vh/i9mSmr1OL5Gw/+xqoI5x4gQth4JOv2eck5p0Gfo2a/JMJVle0+V+fA9VYffhPkpLgg3Kd9t6 x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(23010399003)(1800799024)(366016)(7416014)(376014)(921020)(38070700021)(261021135927099003)(5023799004)(56012099006)(261009223027099003)(261009221227099003)(261028144727099003)(261021121427099003)(261021123027099003)(261021133027099003)(261021130227099003)(261026135527099003)(261026130827099003)(261022115727099003)(261022105027099003)(261022113327099003)(261026140227099003)(261026121527099003)(261022075727099003)(10067099003)(18002099003)(22082099003)(6133799003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?l6/9uvfvlpTVCFvc9+dwZvXIJU2Ifw6D1b1HMCf6kh8HN4dvVZQ3wDUIph?= =?iso-8859-1?Q?eee19/E0tRqDH+J1Wy7FdDOyV/uHJDGWSKtiL7/Eyz0MAzKV9TBGvm7AJH?= =?iso-8859-1?Q?zu12mZaIB6Xm6guSSk78kKJctokC+3cIF23Hq+5Xzfza7m9uwj4JQvwkar?= =?iso-8859-1?Q?X/1g6gsLvRguHXqzWVUSy2OBhTHettds6w2k1Q++0RWVvYCYre8HSraOj0?= =?iso-8859-1?Q?ja5wBYV5KYLBqyrhbs1G7Rnc8LRkXqWFZeLY5iJZS61b7h+/QXv2cZ11DV?= =?iso-8859-1?Q?2klHncfv1N+q7A6nIr69FyzU4UEFYl8kvvskPyCu6/+SKm37S3cU9XAqhZ?= =?iso-8859-1?Q?40ylOortiGyYKfN1x5aDWVkGyuTVWGbXFsa3rcACdOev5hgQGyvzDCdZff?= =?iso-8859-1?Q?2drnJybIxFFHisOWL49CAG/rLxgwxkxCarQwOD61XgG8gwljQo/h77NZ1m?= =?iso-8859-1?Q?IxcgtFskmb3lJzhj5yOfx+JnQjhDAFJCT4/HPFS63Z1ex/F9EdMfyZz8ZO?= =?iso-8859-1?Q?7MVPyXKNuDR2BQ0aPhhkhmV/Q+l8dqdrdOrBZZQ36P6cNd8OBnLg8/E/dS?= =?iso-8859-1?Q?rP8j9jbrjV+GoTpxi1gQU8gL2mkmcT0SxVe2ZO83/JsQ8RsGR544panI7e?= =?iso-8859-1?Q?RbBwl1+8/o5iyZKNahZu6HEUrADJqtlYqpELaxDrU5Xy+jeeE9A+h6H3et?= =?iso-8859-1?Q?UXKEI0Q0zByxtFJDOnlnmya+avsp68iQZi/XWnOvN9tRXjmCKArVT+yZlF?= =?iso-8859-1?Q?HzxMI3pCwhqRoXAvR88e51DSLHJgPayaLsx8aDOeVmp+BarTZx+ixfVKGT?= =?iso-8859-1?Q?YJA1fDjJ0DQyY3pJyEMDgDLPzNj8U8hUO8LE4YdHJ1YF5jcA2XI5Oh3uPw?= =?iso-8859-1?Q?Nt19y6UgkB2x3+3potOoEn8h8C1BFIHYeeutDJDXoMHbxfEQlqI12opuRp?= =?iso-8859-1?Q?8p367KPOwafL1vRsUS7PFZfVdVCJPq3c4oJrClzx9o6+K0W39QYpToE9bB?= =?iso-8859-1?Q?ELUS1AG59uYilgr7dG+6R6CsaxcYBF4RpHUFaIemxT9IuacYHWWQreMUiZ?= =?iso-8859-1?Q?1gymEMDP4d94hJrMzmH3QXZU0WDKvvMGchj/jlSl8BDGWi/4IXcJ1KIwf1?= =?iso-8859-1?Q?RLrBlADx4IfREa/A3Eza9DLpH87hAITUWyFyDyYo8KZzhpMU7hBJK380kh?= =?iso-8859-1?Q?+UbUprRc6aEMrR+h9QDvkk8hn0BmsGS3uKoA3d8BmQxFo+62/mXj/P5up8?= =?iso-8859-1?Q?d7EOUbHvWpp8AXe1NBSz7XJ01NCNJSnC1rqk+9PVSwgnB4/lJJbsyLAkqE?= =?iso-8859-1?Q?4bKyZhBJzkmV8128PGpxBCsHFDVUpl2oQ3tWcKEHU2PDwn+qsyOk5Nii8X?= =?iso-8859-1?Q?prQSoUuAdKLR1bENO+AWu0UiMfJBJRAezBVM1OVJoEWLnRh2WoUQo2SyVs?= =?iso-8859-1?Q?bfl1HVOzLvRumDmuYYMCUkEjnIr3RaapAcNGYMTcqjsNcAwOAFtzA73Rn5?= =?iso-8859-1?Q?NU1vBxKUcKl71J63aYmW9VUOhpWJOL3vlRnIMmVryO//V0KRGN/RFC12CK?= =?iso-8859-1?Q?Y+6sOeoSJxK20gbOQCVhJmuw+zvhcWmb5kVSBi489097SIpNrO2FBNUVZS?= =?iso-8859-1?Q?hTeEZ2EZgVJkBL6xKAF0rkUGgKbE3K9Kc0eULAwxlVD+w5TDUQSevzSzvt?= =?iso-8859-1?Q?8/HWBIcMjlne/ziVOH15r+YvT6z1S9WoeUMYelTbnPgCqrv8bVzpggKLQC?= =?iso-8859-1?Q?P6rOl5BQO3vA1NUxvumk4nHL3v+yWfGj8OOTCsE02LK16xVj+0oKjNJBc1?= =?iso-8859-1?Q?iJh9IUYZlg=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: 4e9QftlPDp8ufEb9nglbfGauXvELPv5CYRw1jsznzFrl9+5gKByZdkdA5WvfPwYXM4PD9tzVJYvxdxwjVCwpNw7+Qipvf4Zk5W8G9Q6VslTsSiIDUNBMxLE3xlxAgA+HwIdKUfdz9UpO/f92Zne1UoTxWu3v0OQBHrk83r4IoP7MYaGqT9k5KI7ZA+il4M+d+udYnm9UbYde508fA3dpFsS3FxCl/4NcX39l8ABUnp+mvkIbIGiVkl5Y28t+afyc1IHnmolSRM81VveSuVR6UMhP15NTINWHt4BDlsByGk+z5YiSb9Mr8W2H282X7fYUMhLd7bz8QX8jc/8CDlJKqw== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5ce4b888-b41a-443d-1531-08df38c2d0f5 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:24.6445 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: cITWlXUUB0SB1zEUy13FpSf0Ra9KGeKvcY1APpt9hTesgDzTgDCSB6G5uYhKmr60akS7duph2z4D0X62wqGym+80nSqVjxiBu9b3xj86oYo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: KL1PR06MB6110 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::7; envelope-from=jamin_lin@aspeedtech.com; helo=TYDPR03CU002.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611500591158500 Content-Type: text/plain; charset="utf-8" Send bulk and interrupt packets to the device and return the result to the host. Each one is a request and an answer, so they reuse the packet tracking and the NAK handling added for control transfers. A bulk request carries a 32 bit length, so the host can ask us to allocate up to 4 GB. Refuse a request that big. Do not answer it with fewer bytes instead: the host counts the bytes it gets back, and it resets the device when some are missing. Advertise usb_redir_cap_32bits_bulk_length. We already read and write the high half of the length, but without the capability redirect.c asserts when its own guest asks for a transfer larger than 64KiB. Signed-off-by: Jamin Lin Reviewed-by: Junjie Cao Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Junjie Cao --- hw/usb/redirect-server.c | 240 ++++++++++++++++++++++++++++++++++++++- hw/usb/trace-events | 6 + 2 files changed, 245 insertions(+), 1 deletion(-) diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index 55a1f79623..9a83cc22ef 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -90,7 +90,15 @@ OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SER= VER) */ #define USBREDIR_SERVER_RETRY_MS 1000 =20 +/* + * The bulk length field is 32 bits, so the host can ask for up to 4 GB. + * This is the largest transfer accepted. + */ +#define USBREDIR_SERVER_MAX_BULK (1 * MiB) + #define USBREDIR_SERVER_CTRL 0 +#define USBREDIR_SERVER_BULK 1 +#define USBREDIR_SERVER_INTERRUPT 2 =20 /* Which message answers the host when a control transfer ends. */ typedef enum { @@ -113,7 +121,9 @@ typedef struct USBRedirServerPkt { USBPacket pkt; =20 /* Kept for the usbredir response. */ + struct usb_redir_interrupt_packet_header intr_hdr; struct usb_redir_control_packet_header ctrl_hdr; + struct usb_redir_bulk_packet_header bulk_hdr; =20 /* * The IOV points here. IN data lands in it, OUT data is copied in. @@ -549,6 +559,67 @@ static void usbredir_server_ctrl_complete(USBRedirServ= er *s, } } =20 +static void usbredir_server_bulk_reply(USBRedirServer *s, uint64_t id, + const struct usb_redir_bulk_packet_header *hdr, uint8_t status, + uint8_t *data, int actual) +{ + struct usb_redir_bulk_packet_header resp =3D *hdr; + bool is_in =3D !!(hdr->endpoint & USB_DIR_IN); + int data_len =3D is_in ? actual : 0; + + resp.status =3D status; + /* Both directions report how much the device moved. */ + resp.length =3D actual; + resp.length_high =3D actual >> 16; + + usbredirparser_send_bulk_packet(s->parser, id, &resp, + data_len > 0 ? data : NULL, data_len); + usbredirparser_do_write(s->parser); +} + +static void usbredir_server_bulk_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + uint8_t status =3D usbredir_server_status(rp->pkt.status); + int actual =3D rp->pkt.actual_length; + + trace_usbredir_server_bulk_complete(rp->redir_id, rp->bulk_hdr.endpoin= t, + status, actual); + usbredir_server_bulk_reply(s, rp->redir_id, &rp->bulk_hdr, status, + rp->data, actual); +} + +static void usbredir_server_interrupt_reply(USBRedirServer *s, uint64_t id, + const struct usb_redir_interrupt_packet_header *hdr, uint8_t status, + uint8_t *data, int actual) +{ + struct usb_redir_interrupt_packet_header resp =3D *hdr; + bool is_in =3D !!(hdr->endpoint & USB_DIR_IN); + int data_len =3D is_in ? actual : 0; + + resp.status =3D status; + /* Both directions report how much the device moved. */ + resp.length =3D actual; + + usbredirparser_send_interrupt_packet(s->parser, id, &resp, + data_len > 0 ? data : NULL, + data_len); + usbredirparser_do_write(s->parser); +} + +static void usbredir_server_interrupt_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + uint8_t status =3D usbredir_server_status(rp->pkt.status); + int actual =3D rp->pkt.actual_length; + + trace_usbredir_server_interrupt_complete(rp->redir_id, + rp->intr_hdr.endpoint, + status, actual); + usbredir_server_interrupt_reply(s, rp->redir_id, &rp->intr_hdr, status, + rp->data, actual); +} + /* * USB port ops */ @@ -622,6 +693,12 @@ static void usbredir_server_packet_complete(USBPort *p= ort, USBPacket *p) case USBREDIR_SERVER_CTRL: usbredir_server_ctrl_complete(s, rp); break; + case USBREDIR_SERVER_BULK: + usbredir_server_bulk_complete(s, rp); + break; + case USBREDIR_SERVER_INTERRUPT: + usbredir_server_interrupt_complete(s, rp); + break; default: g_assert_not_reached(); } @@ -1033,6 +1110,121 @@ static void usbredir_server_get_alt_setting(void *p= riv, uint64_t id, USBREDIR_SERVER_REPLY_ALT); } =20 +static void usbredir_server_bulk_packet(void *priv, uint64_t id, + struct usb_redir_bulk_packet_header *hdr, + uint8_t *data, int data_len) +{ + USBRedirServer *s =3D priv; + int idx =3D usbredir_server_ep_index(hdr->endpoint); + USBDevice *device =3D usbredir_server_device(s); + bool is_in =3D !!(hdr->endpoint & USB_DIR_IN); + int pid =3D is_in ? USB_TOKEN_IN : USB_TOKEN_OUT; + int ep_nr =3D hdr->endpoint & 0x0f; + USBRedirServerPkt *rp; + USBEndpoint *ep; + uint8_t status; + uint32_t len; + + /* The host still waits for an answer, even to a request we refuse. */ + status =3D usbredir_server_ep_status(s, hdr->endpoint, + USB_ENDPOINT_XFER_BULK); + if (status !=3D usb_redir_success) { + trace_usbredir_server_refused(id, hdr->endpoint, status, + USB_ENDPOINT_XFER_BULK, + s->ep[idx].type); + usbredir_server_bulk_reply(s, id, hdr, status, NULL, 0); + usbredirparser_free_packet_data(s->parser, data); + return; + } + + /* IN: what the host asked for. OUT: what the host sent. */ + len =3D is_in ? (((uint32_t)hdr->length_high << 16) | hdr->length) + : (uint32_t)data_len; + + /* + * Too big. Tell the host the transfer failed. + * Do not send back less data instead. The host would see the + * missing bytes as an error and reset the device. + */ + if (len > USBREDIR_SERVER_MAX_BULK) { + trace_usbredir_server_bulk_too_big(id, hdr->endpoint, len); + usbredir_server_bulk_reply(s, id, hdr, usb_redir_inval, NULL, 0); + usbredirparser_free_packet_data(s->parser, data); + return; + } + + ep =3D usb_ep_get(device, pid, ep_nr); + rp =3D usbredir_server_pkt_alloc(len, idx); + rp->redir_id =3D id; + rp->type =3D USBREDIR_SERVER_BULK; + rp->bulk_hdr =3D *hdr; + + usb_packet_setup(&rp->pkt, pid, ep, 0, s->next_id++, false, false); + + /* OUT data comes from the host. IN data is written by the device. */ + if (!is_in && len > 0) { + memcpy(rp->data, data, len); + } + usb_packet_addbuf(&rp->pkt, rp->data, len); + + trace_usbredir_server_bulk(id, hdr->endpoint, len); + usbredirparser_free_packet_data(s->parser, data); + usbredir_server_submit(s, rp); +} + +/* + * The host sends an interrupt_packet. It is a request: interrupt OUT + * data to write, or a single IN request to answer. + */ +static void usbredir_server_interrupt_packet(void *priv, uint64_t id, + struct usb_redir_interrupt_packet_header *hdr, + uint8_t *data, int data_len) +{ + USBRedirServer *s =3D priv; + int idx =3D usbredir_server_ep_index(hdr->endpoint); + USBDevice *device =3D usbredir_server_device(s); + bool is_in =3D !!(hdr->endpoint & USB_DIR_IN); + int pid =3D is_in ? USB_TOKEN_IN : USB_TOKEN_OUT; + int ep_nr =3D hdr->endpoint & 0x0f; + USBRedirServerPkt *rp; + USBEndpoint *ep; + uint8_t status; + int len; + + /* The host still waits for an answer, even to a request we refuse. */ + status =3D usbredir_server_ep_status(s, hdr->endpoint, + USB_ENDPOINT_XFER_INT); + if (status !=3D usb_redir_success) { + trace_usbredir_server_refused(id, hdr->endpoint, status, + USB_ENDPOINT_XFER_INT, + s->ep[idx].type); + usbredir_server_interrupt_reply(s, id, hdr, status, NULL, 0); + usbredirparser_free_packet_data(s->parser, data); + return; + } + + /* IN: what the host asked for. OUT: what the host sent. */ + len =3D is_in ? hdr->length : data_len; + + ep =3D usb_ep_get(device, pid, ep_nr); + rp =3D usbredir_server_pkt_alloc(len, idx); + rp->redir_id =3D id; + rp->type =3D USBREDIR_SERVER_INTERRUPT; + rp->intr_hdr =3D *hdr; + + usb_packet_setup(&rp->pkt, pid, ep, 0, s->next_id++, false, false); + + /* OUT data comes from the host. IN data is written by the device. */ + if (!is_in && len > 0) { + memcpy(rp->data, data, len); + } + usb_packet_addbuf(&rp->pkt, rp->data, len); + + trace_usbredir_server_interrupt(id, hdr->endpoint, len); + usbredirparser_free_packet_data(s->parser, data); + usbredir_server_submit(s, rp); +} + static void usbredir_server_filter_reject(void *priv) { trace_usbredir_server_filter_reject(); @@ -1056,6 +1248,24 @@ static void usbredir_server_interface_info(void *pri= v, /* The host should not send this to a device. Nothing to do. */ } =20 +static void usbredir_server_alloc_bulk_streams(void *priv, uint64_t id, + struct usb_redir_alloc_bulk_streams_header *hdr) +{ + /* We do not advertise bulk streams. Nothing to do. */ +} + +static void usbredir_server_start_bulk_receiving(void *priv, uint64_t id, + struct usb_redir_start_bulk_receiving_header *hdr) +{ + /* We do not advertise this. Nothing to do. */ +} + +static void usbredir_server_stop_bulk_receiving(void *priv, uint64_t id, + struct usb_redir_stop_bulk_receiving_header *hdr) +{ + /* We do not advertise this. Nothing to do. */ +} + static void usbredir_server_cancel_data_packet(void *priv, uint64_t id) { USBRedirServer *s =3D priv; @@ -1096,7 +1306,9 @@ static void usbredir_server_cancel_data_packet(void *= priv, uint64_t id) static void usbredir_server_send_cancelled(USBRedirServer *s, USBRedirServerPkt *rp) { + struct usb_redir_interrupt_packet_header intr; struct usb_redir_control_packet_header ctrl; + struct usb_redir_bulk_packet_header bulk; =20 switch (rp->type) { case USBREDIR_SERVER_CTRL: @@ -1106,6 +1318,21 @@ static void usbredir_server_send_cancelled(USBRedirS= erver *s, usbredirparser_send_control_packet(s->parser, rp->redir_id, &ctrl, NULL, 0); break; + case USBREDIR_SERVER_BULK: + bulk =3D rp->bulk_hdr; + bulk.status =3D usb_redir_cancelled; + bulk.length_high =3D 0; + bulk.length =3D 0; + usbredirparser_send_bulk_packet(s->parser, rp->redir_id, + &bulk, NULL, 0); + break; + case USBREDIR_SERVER_INTERRUPT: + intr =3D rp->intr_hdr; + intr.status =3D usb_redir_cancelled; + intr.length =3D 0; + usbredirparser_send_interrupt_packet(s->parser, rp->redir_id, + &intr, NULL, 0); + break; default: return; } @@ -1153,6 +1380,8 @@ static void usbredir_server_create_parser(USBRedirSer= ver *s) s->parser->hello_func =3D usbredir_server_hello; s->parser->reset_func =3D usbredir_server_reset; s->parser->control_packet_func =3D usbredir_server_control_packet; + s->parser->bulk_packet_func =3D usbredir_server_bulk_packet; + s->parser->interrupt_packet_func =3D usbredir_server_interrupt_packet; s->parser->set_configuration_func =3D usbredir_server_set_configuratio= n; =20 /* The parser calls these directly, so they must not be NULL. */ @@ -1164,12 +1393,21 @@ static void usbredir_server_create_parser(USBRedirS= erver *s) s->parser->device_disconnect_ack_func =3D usbredir_server_device_disconnect_ack; s->parser->interface_info_func =3D usbredir_server_interface_info; + s->parser->alloc_bulk_streams_func =3D usbredir_server_alloc_bulk_stre= ams; s->parser->cancel_data_packet_func =3D usbredir_server_cancel_data_pac= ket; + s->parser->start_bulk_receiving_func =3D + usbredir_server_start_bulk_receiving; + s->parser->stop_bulk_receiving_func =3D + usbredir_server_stop_bulk_receiving; =20 - /* Capabilities: 64-bit IDs, connect_device_version, ep_info sizes */ + /* + * Capabilities: 64-bit IDs, connect_device_version, ep_info sizes + * and 32-bit bulk lengths. + */ usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version= ); usbredirparser_caps_set_cap(caps, usb_redir_cap_ep_info_max_packet_siz= e); usbredirparser_caps_set_cap(caps, usb_redir_cap_64bits_ids); + usbredirparser_caps_set_cap(caps, usb_redir_cap_32bits_bulk_length); =20 /* * In USB the host is the side that starts every transfer; a device diff --git a/hw/usb/trace-events b/hw/usb/trace-events index d63156a930..5ec5127efa 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -417,3 +417,9 @@ usbredir_server_nak_park(uint64_t id, int ep) "id %" PR= Iu64 " ep %d" usbredir_server_nak_retry(uint64_t id, int ep) "id %" PRIu64 " ep %d" usbredir_server_ctrl_complete(uint64_t id, int status, int actual) "id %" = PRIu64 " status %d actual %d" usbredir_server_ctrl_refused(uint64_t id, int status) "id %" PRIu64 " stat= us %d" +usbredir_server_bulk(uint64_t id, uint8_t ep, size_t len) "id %" PRIu64 " = ep 0x%02x len %zu" +usbredir_server_bulk_complete(uint64_t id, uint8_t ep, int status, int act= ual) "id %" PRIu64 " ep 0x%02x status %d actual %d" +usbredir_server_bulk_too_big(uint64_t id, uint8_t ep, uint32_t len) "id %"= PRIu64 " ep 0x%02x len %u" +usbredir_server_refused(uint64_t id, uint8_t ep, int status, uint8_t want,= uint8_t got) "id %" PRIu64 " ep 0x%02x status %d, wanted type %u, it is %u" +usbredir_server_interrupt(uint64_t id, uint8_t ep, size_t len) "id %" PRIu= 64 " ep 0x%02x len %zu" +usbredir_server_interrupt_complete(uint64_t id, uint8_t ep, int status, in= t actual) "id %" PRIu64 " ep 0x%02x status %d actual %d" --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611490; cv=pass; d=zohomail.com; s=zohoarc; b=goG6gJdTjbGR/EJQvebu4VZYODcRtpm7Y9zGZ0n+h/5YI/Vjl67Al9BAfdgVCXbQmVFurN+GD8wweLUQ+NGXh5WZbKEQpEL0WcrpSjRd70UGey7qCB2Xrk9CKzZQVz61Jm/MXQd1m3ceMQIW8orYZsySTdcSNrfw61OSInPEUMw= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611490; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=f5m4vFgqwJ7d4DsSLSFySW7I7g6HmM6xGn7bEovmalM=; b=iBe3VVeHd5iErtOajjDUEXhwJC7zx5xnYpyaPRNQtsN2K++t2/WtsjXwe8PpjfaeIPLXmf2Rf8MYCA9Erhgp3//qb8K2iB+cyri/Q3mgDSpgY8eJklHQsY2AOXVr9nz+Bw2972x12IUw/tcssslpjG6OOS512j+tJkZPSgtMeqQ= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 179361149032893.32893969246788; Mon, 2 Nov 2026 01:24:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGO-0007iC-Uc; Mon, 02 Nov 2026 04:23:36 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFg-0007O5-DK; Mon, 02 Nov 2026 04:22:59 -0500 Received: from mail-japaneastazlp170130007.outbound.protection.outlook.com ([2a01:111:f403:c405::7] helo=TYDPR03CU002.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFQ-0000Zc-PZ; Mon, 02 Nov 2026 04:22:39 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TYNPR06MB9200.apcprd06.prod.outlook.com (2603:1096:405:3d5::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:31 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:31 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hnW8BwR6yUMh2WDfGAk0IBQoPkYN0s1+1d9XAZpk31ln+w71kLjqzaULhxjAZZL13NVupmmsddsf8hko+HeEDC27tf4T0UlC6NkJUHxqpSBmENUjNhoeAJrMR9bwGARM1/vrwx0pVd1pTIw6B6RDYgIWYG4H9l9RCI9mc77eQHDFuGk5ru3SbmHC4k9iKSDSmZqRTbt9oKji08tQgzcAwv5atkXv1ggqM5z7IYERTSQFxWSQkddF6PTWdwx6aEtoKUBE5hcLcFrM1GUe4HvGma6wrf8r3lJ5B9+Y9Gp/5nQOD8G1VrYKgZdgxiK9gDreM7zn228viyiw11zJvQl4aA== 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=f5m4vFgqwJ7d4DsSLSFySW7I7g6HmM6xGn7bEovmalM=; b=pJiPsezEw1IRMS8V7Im2LNNu9BPLZyyzEjdAIecGw4URgxu/G02z1UbZEl+8ieFDpfPX7SJbfAlYJjxT7pfrR4ZUUDb/Io3z/dVRrVviQzlIAJh0v1YlJiUrdE2fDKcFA6pTrF9ynQkxtKejGu1mxEbu0LF62FpnbEfyOjbHDjSRyXkQRbfC1/5MlKSGe8Ag9cG7hyBhVkkoOe9D+KfrBs7tyr7Hq1/S9pQn4xb/GHdHtaEtLz3sNvcxUF1UU8HAY78Z5e5j3KlmpPQOYdiG1u8IxF9KK0AhkrCke789+mDewOZMYBWcxaFzKRJqIuUxUK5cmOgURkCj3ewGChHaCg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=f5m4vFgqwJ7d4DsSLSFySW7I7g6HmM6xGn7bEovmalM=; b=eRL6zqrIMHSGEcHIT0oVaLtaWSFUdGI1mu2EbhZzxDSKbJ55D9zOPb2PPAz9P43bmwRnxOiFNM6EL+c7hU8I5yJFX2g1P98g45oSwW6iIMMCk6fN5DrnuVRTBiyfkOzimBcWR8J3K/LrvJPNLAHGKz7lZz2kI1fJ9mLaq+KDC1yRs8G9taQGoKRBHVCTiRLrApLwjmDWzwL9xSWMgn722rlNmJidWdtTPk4RAM7XL0Zm7h6NT80fCld6eJ3LY3lNY9me9IQe4qOuqJxs+SNjebaX0JPngQ7HpWzWmbMm3zgQ9ZYrhP2zlHyFTBunZUeyapYB81e9JHWTbmXRBZKMug== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 16/18] hw/usb/redirect-server: Stream interrupt IN endpoints Thread-Topic: [PATCH v8 16/18] hw/usb/redirect-server: Stream interrupt IN endpoints Thread-Index: AQHdaqusEi/dXAV6WUG6mAb2gc7SGg== Date: Mon, 2 Nov 2026 09:22:26 +0000 Message-ID: <20261102092201.1729245-17-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|TYNPR06MB9200:EE_ x-ms-office365-filtering-correlation-id: bff08b16-1622-4acd-2d19-08df38c2d21a x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|7416014|366016|1800799024|10067099003|18002099003|22082099003|921020|38070700021|56012099006|5023799004|261021121427099003|261022113327099003|261022075727099003|261026121527099003|261022105027099003|261026140227099003|261009223027099003|261028144727099003|261021123027099003; x-microsoft-antispam-message-info: ITZWEmKUF7oTxfRhKbnxpzA6oHc6WAAZhiqIPeR5dS+p1UmOEoGRh6px60eCreoVa0V0LpKlwXMa3FR/8POU/v1BhRkib49JB0H2eWU5kEKrVtGLUHjgIpBv9I7VqCtTanILuj5unL2CwZUoEjY8k53qXMVC2HEw1wGjbzg/AREDAIYb16aEef2+4qCTj0MsSDuTeKf/3rgCdS49TLKIMsZa9B4n1VziU7FJP1k0v5GPEOt+69tymkqLg2BlfTJA51lJTq0c+qdDfKUSUVRK7JaANDw93pRhnUmAsWF14DAICYZeBePG2GoPTouB9T1T7XdAsUxc9oCiqABNvKGQPe8+gMpZDdFACuaMrkzsdqWTWlMdW46sl9ro1+oNo2nv3a5iLHuz0N8wcEESWwfmbQagLyl7bMC/xMGDOKRxXKwQVeLvEZeSs2GgEGrIkFQvS96294Fiz0+qN7S3v/DdxZy/IOmbbyct1AyBjaPvC9Daug5fEaZW8vdHxkTx7axz1rpB/ljhaIVD44LVpcPrZCWSMp0zC/Q0S95o4B/mI4zgke8OfDx6AIhZLuWYbPI1zgJZKe0geicQz5cCKF4pJ7D9kkfSIGknPNfCz8/TCoFv2ETXcKYVxIHDntRaKt40QFTHjVgrzYsFx92p2C8LSmXOd2t46lD58Poh5gHB7wTZBhQZRHHCy3BDpLcf8Wj5j8Cc41hUsKEH7nKuqbfJgn1rnqV9yn1PlyOZsrVdJ04= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(376014)(23010399003)(7416014)(366016)(1800799024)(10067099003)(18002099003)(22082099003)(921020)(38070700021)(56012099006)(5023799004)(261021121427099003)(261022113327099003)(261022075727099003)(261026121527099003)(261022105027099003)(261026140227099003)(261009223027099003)(261028144727099003)(261021123027099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?b6ebnCYGdPJ57FCe37CRPbq6fRTJWYywJ/0jVzMxmkPsEwBa8bvrvFhTY4?= =?iso-8859-1?Q?HpiQ+/v5MK/w66WinaIT06nF4UTVtlPM5hTJMkWWwl7IRk7XDy92IvC58l?= =?iso-8859-1?Q?mt8UUVDrxtz8ploXn6M9U9QFuKBxXGg1X19v7Qe2Rj7JmstJL35HBplhD2?= =?iso-8859-1?Q?gjDeHxi1USeZMDP8hgEbDN/zkMIH0K9HDltFVzunl+A23W2zDZJ/37xKUn?= =?iso-8859-1?Q?H1dal20kztS7u4WfKvBU/tp/FDaxdpC5vmjfi7jZ4M2ZCXVRXZOAFLv4RS?= =?iso-8859-1?Q?QKKtGhzeUM/JrYTA/qZiL8e61eE+g7MKhIUDS85lNAlNlAGYp1ahgvtqEi?= =?iso-8859-1?Q?BmVATri535YnwGyhfN8VX6E0R8FttStrRI1IKwXFid6gBFSLKmwtytvApb?= =?iso-8859-1?Q?3DULTm0udnMXd3PV6eEksUL3SdPR3mq5dGE2uCItMICVdVKEJFE+cIiTvh?= =?iso-8859-1?Q?pIXA0XiwE6rRGdm7/LtIvSfPTpdxN5sMS+XsU/hgt1a1vH9SQLpQ/y0G4f?= =?iso-8859-1?Q?SPas8HQ9rC9TsISAkGtcFRV0Ib2XPPdt3DSeyN1a9KUMecGkk1CW/zjtsK?= =?iso-8859-1?Q?H67lqBGDoGplbhb4ELO6CCGz04iY8B27hgImpEGoWDxQEeU6PRaP+5gZ8+?= =?iso-8859-1?Q?PqkFPCPFUeZdU9PJVA4sKhgESBcxN/dzQp6PlJosfUH7HctNoP8sntq+g1?= =?iso-8859-1?Q?IaY4ZGiAOUZNDbrD7QfEh63VDlMLkx08IdIB/3Piu3QFbUrZfMnSesjKK0?= =?iso-8859-1?Q?rUrEKY3geOKULmz8UbDl0pjOGckRAkizrQrawkOzvAaX95qkfgsL1D5Mqp?= =?iso-8859-1?Q?lhIAxxhZA11+epRm7+XQcNgI3VJViXX05y/kjwII3cYDN7ry80YWjfkv1+?= =?iso-8859-1?Q?yfTriBqjLk3Go+147k/AjB8T0UuZRC1ZQdzQvowQ9oP0VZGAaszQwjCtuA?= =?iso-8859-1?Q?kNJ2prffF+B/W8ZGVEzY/ZNhPIqUslJSY4bX8vqHoIj3p0p65xTE37C5Lk?= =?iso-8859-1?Q?l56vs7e2Yw3uwSJFb65TURW4CkkIKYXl5biBVDrQ+rj6k8LrZDC2QErKu3?= =?iso-8859-1?Q?oeEuterOGYo7wGbA3e6buFrrIRZ8Bu8SbTjbST30XjqzLHzDzwote2pint?= =?iso-8859-1?Q?+nkB4qb27bBIsqNMntRKrfD92n+RyKhd5AmrXqn81Q8cs+Ei8qHnJ3nVn5?= =?iso-8859-1?Q?jnvvlCZuvX/LiqBLAklp8E7ibpQAJcv0oST3R0OzT0gkC+XEHTigDtWIg3?= =?iso-8859-1?Q?j52MXusnZzLzoJjMX9etYnOmt6QeWFVAXLxiM7x8flz82/4ga2YBm8OWqu?= =?iso-8859-1?Q?VvXLBP40VkCHJGQrSviTeNN5RvlPjr8YG8IX9xzzFI7RPd1mE/zQETiOrW?= =?iso-8859-1?Q?9m3MxS5B2x8NGZrTOMWviU35U6/jOCL/8EMhgTPBYp4B6kqzHwor2dKMfm?= =?iso-8859-1?Q?SYHUO6Yr8gPS28qg/DjOl6ye87KICnX3bZ78J01a/At5lUsWJyIj/ufPzu?= =?iso-8859-1?Q?2LS4qBPewMwn2n2BJLpb1xTHtQ3yseE1n53pl+hpY1cw2BYyjPQZDDZ0J8?= =?iso-8859-1?Q?HuLWMUT2mdJl7VYnnOVWq37vJmFWga6Mu2k1/xH1TztPshJ9wPQdCHv0+G?= =?iso-8859-1?Q?AywsI0zMzAYpQXhde77W4+JCLczW3PPn2hRZQugURbbKwrjhJtpxXr7F1H?= =?iso-8859-1?Q?dm4CGJyEsvJKxinMb9BhHWuPhAEXwZ4gt8kkl6pYh/Gqp4a3w71XP0stPz?= =?iso-8859-1?Q?YwXBFZC+ImXekQ1RldP7V4yWaiFSC+yE0JTRTKTTJHchYVeTxH+5kWEfXb?= =?iso-8859-1?Q?sEtCxdZNDA=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: noBYpc6iEeiLzf0oyCmz1BEfxgKJf8n3ujU7bxVPeFZJkdE6Sh09ilmZbrodn/pPlfpw45QlVEGjoyIbQIpjuOc8ON0Jibo/FZ5lz8SewlyayTdTf+7s70LY54zw38AzpbhtrK9p6DkiIp7+tSm6Je8wrWRxamlhNtcntrOBV0dNKKtWTHtFSGD53UQAyGC5jvMnKPyFL21bWA8HEbhAAtTZj2LbGf5pRUS/emg6K9bOvK6u+wHQOTh/BiIGFfrj4lW8/1hOjzawT8trjoNwln06ZLka27Tj70nQ64/9vJpoKMYsubqxFkgscQhCGvcZ+WL2TKD6BElAW7OYpP47oA== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bff08b16-1622-4acd-2d19-08df38c2d21a X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:26.1413 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 48Fchs8MIibyukMV/pB0heWTnK2bW++l+OVN4BUn2KRoAaWvZzda9XKcfqcZ2tSUsetN6DZkYYoFOIq+KfGwCgkqMNdpfrNnhSxeuCXGnKQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYNPR06MB9200 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::7; envelope-from=jamin_lin@aspeedtech.com; helo=TYDPR03CU002.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611493257154100 Content-Type: text/plain; charset="utf-8" Interrupt IN is not a request and an answer in usbredir. The host asks once with start_interrupt_receiving. After that it expects a packet every time the device has data. Park one IN packet on the device for each streaming endpoint. A device that answers USB_RET_ASYNC holds the packet and completes it when it has data. A device that answers USB_RET_NAK gives the packet back at once, so park a new one when the bus reports a wakeup on that endpoint. A slow timer parks one too, for a device that does not report a wakeup. A streamed request does not wait on the endpoint's list the way a host request does, because this timer already asks again. Wait for the endpoint's bInterval before parking the next one. Some devices answer every time. Without the wait we would ask as fast as the main loop runs, and the guest would get no time. On an error other than a stall the stream stays up, but back off to the slow timer. At a high speed bInterval of 125us an endpoint that keeps failing would otherwise send thousands of status messages a second. Give every endpoint its own timer and bottom half. We ask each endpoint at its own rate. Drop the timer when the bottom half has already asked, so it does not fire for nothing. Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/usb/redirect-server.c | 309 ++++++++++++++++++++++++++++++++++++++- hw/usb/trace-events | 4 + 2 files changed, 308 insertions(+), 5 deletions(-) diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index 9a83cc22ef..cfd2bcc438 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -96,9 +96,13 @@ OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SER= VER) */ #define USBREDIR_SERVER_MAX_BULK (1 * MiB) =20 +/* Buffer size for an interrupt IN endpoint before its descriptor is seen.= */ +#define USBREDIR_SERVER_INTR_STREAM_DEFAULT_LEN 64 + #define USBREDIR_SERVER_CTRL 0 #define USBREDIR_SERVER_BULK 1 #define USBREDIR_SERVER_INTERRUPT 2 +#define USBREDIR_SERVER_INTR_STREAM 3 =20 /* Which message answers the host when a control transfer ends. */ typedef enum { @@ -156,6 +160,15 @@ typedef struct USBRedirServerEp { /* Asks again for a device that does not wake the endpoint. */ QEMUTimer *retry; =20 + /* + * Interrupt IN streaming. The timer asks the device again at the + * endpoint's own rate, and more slowly after a NAK or an error. + * The bottom half asks at once when the device says it has data. + */ + QEMUTimer *intr_stream_timer; + QEMUBH *intr_stream_bh; + bool intr_streaming; + uint16_t max_packet; uint8_t interval; uint8_t iface; @@ -184,7 +197,7 @@ struct USBRedirServer { bool host_connected; bool device_announced; =20 - /* Every request the host is still waiting for an answer to. */ + /* Every request waiting for the device to answer. */ QTAILQ_HEAD(, USBRedirServerPkt) inflight; uint64_t next_id; =20 @@ -620,6 +633,97 @@ static void usbredir_server_interrupt_complete(USBRedi= rServer *s, rp->data, actual); } =20 +/* + * How long to wait before asking the device again. bInterval means + * different things at different speeds: a number of frames at low and + * full speed, an exponent at high speed. + */ +static int64_t usbredir_server_intr_stream_period_ns(USBRedirServer *s, + int ep_nr) +{ + int idx =3D usbredir_server_ep_index(ep_nr | USB_DIR_IN); + USBDevice *device =3D usbredir_server_device(s); + uint8_t interval =3D s->ep[idx].interval; + + if (interval =3D=3D 0) { + interval =3D 1; + } + + if (device && device->speed =3D=3D USB_SPEED_HIGH) { + interval =3D MIN(interval, 16); + return (1LL << (interval - 1)) * 125 * SCALE_US; + } + + return (int64_t)interval * SCALE_MS; +} + +/* + * The device answered a streamed request. Send the answer to the host, th= en + * ask again, because the host still wants more. Do not ask from here: the + * device may answer at once, and this function would call itself over and + * over. Arm the timer instead. It also waits for the endpoint's bInterval. + */ +static void usbredir_server_intr_stream_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + struct usb_redir_interrupt_packet_header resp =3D rp->intr_hdr; + struct usb_redir_interrupt_receiving_status_header st; + int idx =3D usbredir_server_ep_index(resp.endpoint); + int ep_nr =3D resp.endpoint & 0x0f; + USBRedirServerEp *ep =3D &s->ep[idx]; + USBPacket *p =3D &rp->pkt; + int actual =3D p->actual_length; + bool retry =3D false; + int64_t delay_ns; + + trace_usbredir_server_intr_stream_complete(ep_nr, p->status, actual); + + switch (p->status) { + case USB_RET_SUCCESS: + resp.status =3D usb_redir_success; + resp.length =3D actual; + usbredirparser_send_interrupt_packet(s->parser, 0, &resp, + actual ? rp->data : NULL, + actual); + usbredirparser_do_write(s->parser); + break; + case USB_RET_NAK: + /* no data yet; wait, unless the device wakes us first */ + retry =3D true; + break; + default: + /* + * The endpoint failed. There is no data, so send a status + * message instead. The host gives it to its guest. + * + * redirect.c ends the stream only on a stall, so do the same + * here. If we end it on any other error, the host still + * thinks the stream runs, and it never asks again. + */ + st.endpoint =3D resp.endpoint; + st.status =3D usbredir_server_status(p->status); + usbredirparser_send_interrupt_receiving_status(s->parser, 0, &st); + usbredirparser_do_write(s->parser); + if (p->status =3D=3D USB_RET_STALL) { + ep->intr_streaming =3D false; + } else { + /* the stream stays up, but do not ask at the endpoint's rate = */ + retry =3D true; + } + break; + } + + if (ep->intr_streaming) { + if (retry) { + delay_ns =3D (int64_t)USBREDIR_SERVER_RETRY_MS * SCALE_MS; + } else { + delay_ns =3D usbredir_server_intr_stream_period_ns(s, ep_nr); + } + timer_mod(ep->intr_stream_timer, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + delay_ns); + } +} + /* * USB port ops */ @@ -699,6 +803,9 @@ static void usbredir_server_packet_complete(USBPort *po= rt, USBPacket *p) case USBREDIR_SERVER_INTERRUPT: usbredir_server_interrupt_complete(s, rp); break; + case USBREDIR_SERVER_INTR_STREAM: + usbredir_server_intr_stream_complete(s, rp); + break; default: g_assert_not_reached(); } @@ -738,9 +845,11 @@ static USBRedirServerAsk usbredir_server_ask_device(US= BRedirServer *s, =20 /* * Keep the request and send it again when the device wakes the - * endpoint. + * endpoint. A streamed request asks again by itself, with its own + * timer. */ - if (rp->pkt.status =3D=3D USB_RET_NAK) { + if (rp->pkt.status =3D=3D USB_RET_NAK && + rp->type !=3D USBREDIR_SERVER_INTR_STREAM) { trace_usbredir_server_nak_park(rp->redir_id, rp->ep_idx); QTAILQ_INSERT_HEAD(&ep->waiting, rp, waiting_link); timer_mod(ep->retry, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + @@ -786,8 +895,18 @@ static void usbredir_server_wakeup_ep(USBBus *bus, USB= Endpoint *ep, { USBRedirServer *s =3D container_of(bus, USBRedirServer, bus); uint8_t addr =3D ep->nr | (ep->pid =3D=3D USB_TOKEN_IN ? USB_DIR_IN : = 0); + int idx =3D usbredir_server_ep_index(addr); =20 - usbredir_server_kick_ep(s, usbredir_server_ep_index(addr)); + /* + * The device has data. A streaming interrupt IN endpoint may have + * answered NAK. Ask now instead of waiting for the retry timer. + */ + if (s->ep[idx].intr_streaming) { + qemu_bh_schedule(s->ep[idx].intr_stream_bh); + } + + /* The host may also have a request stopped on this endpoint. */ + usbredir_server_kick_ep(s, idx); } =20 static USBBusOps usbredir_server_bus_ops =3D { @@ -841,6 +960,95 @@ static void usbredir_server_pkt_free(USBRedirServer *s= , USBRedirServerPkt *rp) g_free(rp); } =20 +/* + * Interrupt IN streaming + */ + +static bool usbredir_server_intr_stream_inflight(USBRedirServer *s, int ep= _nr) +{ + USBRedirServerPkt *rp; + + QTAILQ_FOREACH(rp, &s->inflight, inflight_link) { + if (rp->type =3D=3D USBREDIR_SERVER_INTR_STREAM && + (rp->intr_hdr.endpoint & 0x0f) =3D=3D ep_nr) { + return true; + } + } + return false; +} + +/* + * Ask the device for data on @ep_nr and leave the request waiting. A devi= ce + * sends data only when asked. Do nothing if a request on @ep_nr is still + * unanswered. + */ +static void usbredir_server_intr_stream_park(USBRedirServer *s, int ep_nr) +{ + USBDevice *device =3D usbredir_server_device(s); + int idx =3D usbredir_server_ep_index(ep_nr | USB_DIR_IN); + USBRedirServerPkt *rp; + USBEndpoint *ep; + int len; + + /* No device to ask. */ + if (!device || !device->attached) { + return; + } + + /* The host did not ask for this endpoint, or a request is unanswered.= */ + if (!s->ep[idx].intr_streaming || + usbredir_server_intr_stream_inflight(s, ep_nr)) { + return; + } + + len =3D s->ep[idx].max_packet; + if (len =3D=3D 0) { + len =3D USBREDIR_SERVER_INTR_STREAM_DEFAULT_LEN; + } + ep =3D usb_ep_get(device, USB_TOKEN_IN, ep_nr); + rp =3D usbredir_server_pkt_alloc(len, idx); + rp->type =3D USBREDIR_SERVER_INTR_STREAM; + /* A streamed request comes from us, not from the host. */ + rp->redir_id =3D 0; + rp->intr_hdr.endpoint =3D ep_nr | USB_DIR_IN; + + usb_packet_setup(&rp->pkt, USB_TOKEN_IN, ep, 0, s->next_id++, + false, false); + usb_packet_addbuf(&rp->pkt, rp->data, len); + + /* + * The timer is there for a device that does not wake the endpoint. + * We are asking now, so drop it. The answer sets it again. + */ + timer_del(s->ep[idx].intr_stream_timer); + + trace_usbredir_server_intr_stream_park(ep_nr, len); + usbredir_server_submit(s, rp); +} + +/* BH and timer callback: ask again on one streaming endpoint. */ +static void usbredir_server_intr_stream_kick(void *opaque) +{ + USBRedirServerEp *ep =3D opaque; + int ep_nr =3D ep->idx - USBREDIR_SERVER_EP_IN_BASE; + + usbredir_server_intr_stream_park(ep->s, ep_nr); +} + +static void usbredir_server_intr_stream_cancel(USBRedirServer *s, int ep_n= r) +{ + USBRedirServerPkt *tmp; + USBRedirServerPkt *rp; + + QTAILQ_FOREACH_SAFE(rp, &s->inflight, inflight_link, tmp) { + if (rp->type !=3D USBREDIR_SERVER_INTR_STREAM || + (rp->intr_hdr.endpoint & 0x0f) !=3D ep_nr) { + continue; + } + usbredir_server_pkt_free(s, rp); + } +} + /* * usbredirparser I/O and logging callbacks */ @@ -1248,6 +1456,63 @@ static void usbredir_server_interface_info(void *pri= v, /* The host should not send this to a device. Nothing to do. */ } =20 +/* + * The host asks to stream an interrupt IN endpoint. Send the receiving + * status first. Without that status the host throws the interrupt + * packet away. Then ask the device once. + */ +static void usbredir_server_start_interrupt_receiving(void *priv, + uint64_t id, struct usb_redir_start_interrupt_receiving_header *hdr) +{ + struct usb_redir_interrupt_receiving_status_header st =3D { + .endpoint =3D hdr->endpoint, + .status =3D usb_redir_success, + }; + int idx =3D usbredir_server_ep_index(hdr->endpoint); + int ep_nr =3D hdr->endpoint & 0x0f; + USBRedirServer *s =3D priv; + + st.status =3D usbredir_server_ep_status(s, hdr->endpoint, + USB_ENDPOINT_XFER_INT); + + /* Only an interrupt IN endpoint can stream. */ + if (!(hdr->endpoint & USB_DIR_IN)) { + st.status =3D usb_redir_inval; + } + + if (st.status =3D=3D usb_redir_success) { + s->ep[idx].intr_streaming =3D true; + } + + trace_usbredir_server_intr_stream_start(hdr->endpoint, st.status); + usbredirparser_send_interrupt_receiving_status(s->parser, id, &st); + usbredirparser_do_write(s->parser); + + if (st.status =3D=3D usb_redir_success) { + usbredir_server_intr_stream_park(s, ep_nr); + } +} + +static void usbredir_server_stop_interrupt_receiving(void *priv, uint64_t = id, + struct usb_redir_stop_interrupt_receiving_header *hdr) +{ + int idx =3D usbredir_server_ep_index(hdr->endpoint); + int ep_nr =3D hdr->endpoint & 0x0f; + USBRedirServer *s =3D priv; + + trace_usbredir_server_intr_stream_stop(hdr->endpoint); + + /* Endpoint 0 is control, and an OUT endpoint never streams. */ + if (ep_nr =3D=3D 0 || !(hdr->endpoint & USB_DIR_IN)) { + return; + } + + s->ep[idx].intr_streaming =3D false; + qemu_bh_cancel(s->ep[idx].intr_stream_bh); + timer_del(s->ep[idx].intr_stream_timer); + usbredir_server_intr_stream_cancel(s, ep_nr); +} + static void usbredir_server_alloc_bulk_streams(void *priv, uint64_t id, struct usb_redir_alloc_bulk_streams_header *hdr) { @@ -1273,6 +1538,14 @@ static void usbredir_server_cancel_data_packet(void = *priv, uint64_t id) int idx; =20 QTAILQ_FOREACH(rp, &s->inflight, inflight_link) { + /* + * A streamed request comes from us, not from the host. + * The host has no id for it, so a cancel never matches it. + */ + if (rp->type =3D=3D USBREDIR_SERVER_INTR_STREAM) { + continue; + } + if (rp->redir_id =3D=3D id) { idx =3D rp->ep_idx; =20 @@ -1348,6 +1621,12 @@ static void usbredir_server_stop_transfers(USBRedirS= erver *s) timer_del(s->ep[i].retry); } =20 + for (i =3D USBREDIR_SERVER_EP_IN_BASE + 1; i < USBREDIR_SERVER_MAX_EP;= i++) { + s->ep[i].intr_streaming =3D false; + qemu_bh_cancel(s->ep[i].intr_stream_bh); + timer_del(s->ep[i].intr_stream_timer); + } + /* * No "cancelled" response here. This runs on a bus reset, a detach or * a closed chardev, and the host has dropped its own queues already. @@ -1393,6 +1672,10 @@ static void usbredir_server_create_parser(USBRedirSe= rver *s) s->parser->device_disconnect_ack_func =3D usbredir_server_device_disconnect_ack; s->parser->interface_info_func =3D usbredir_server_interface_info; + s->parser->start_interrupt_receiving_func =3D + usbredir_server_start_interrupt_receiving; + s->parser->stop_interrupt_receiving_func =3D + usbredir_server_stop_interrupt_receiving; s->parser->alloc_bulk_streams_func =3D usbredir_server_alloc_bulk_stre= ams; s->parser->cancel_data_packet_func =3D usbredir_server_cancel_data_pac= ket; s->parser->start_bulk_receiving_func =3D @@ -1535,6 +1818,16 @@ static void usbredir_server_realize(DeviceState *dev= , Error **errp) s->ep[i].retry =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, usbredir_server_retry_ep, &s->ep[i]); } + + /* Only an interrupt IN endpoint streams, so endpoint 0 and OUT are ou= t. */ + for (i =3D USBREDIR_SERVER_EP_IN_BASE + 1; i < USBREDIR_SERVER_MAX_EP;= i++) { + s->ep[i].intr_stream_timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, + usbredir_server_intr_stream_k= ick, + &s->ep[i]); + s->ep[i].intr_stream_bh =3D + qemu_bh_new_guarded(usbredir_server_intr_stream_kick, &s->ep[i= ], + &dev->mem_reentrancy_guard); + } s->config_descs =3D g_hash_table_new_full(g_direct_hash, g_direct_equa= l, NULL, g_free); usbredir_server_clear_ep_table(s); @@ -1545,7 +1838,6 @@ static void usbredir_server_realize(DeviceState *dev,= Error **errp) usb_register_port(&s->bus, &s->port, s, 0, &usbredir_server_port_ops, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL | USB_SPEED_MASK_HIGH); - s->chardev_close_bh =3D qemu_bh_new_guarded(usbredir_server_chardev_cl= ose_bh, s, &dev->mem_reentrancy_guar= d); s->announce_bh =3D qemu_bh_new_guarded(usbredir_server_announce_device= , s, @@ -1582,6 +1874,13 @@ static void usbredir_server_unrealize(DeviceState *d= ev) timer_free(s->ep[i].retry); s->ep[i].retry =3D NULL; } + + for (i =3D USBREDIR_SERVER_EP_IN_BASE + 1; i < USBREDIR_SERVER_MAX_EP;= i++) { + timer_free(s->ep[i].intr_stream_timer); + s->ep[i].intr_stream_timer =3D NULL; + qemu_bh_delete(s->ep[i].intr_stream_bh); + s->ep[i].intr_stream_bh =3D NULL; + } } =20 static const Property usbredir_server_props[] =3D { diff --git a/hw/usb/trace-events b/hw/usb/trace-events index 5ec5127efa..6eb47085d0 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -423,3 +423,7 @@ usbredir_server_bulk_too_big(uint64_t id, uint8_t ep, u= int32_t len) "id %" PRIu6 usbredir_server_refused(uint64_t id, uint8_t ep, int status, uint8_t want,= uint8_t got) "id %" PRIu64 " ep 0x%02x status %d, wanted type %u, it is %u" usbredir_server_interrupt(uint64_t id, uint8_t ep, size_t len) "id %" PRIu= 64 " ep 0x%02x len %zu" usbredir_server_interrupt_complete(uint64_t id, uint8_t ep, int status, in= t actual) "id %" PRIu64 " ep 0x%02x status %d actual %d" +usbredir_server_intr_stream_start(uint8_t ep, int status) "start_interrupt= _receiving ep 0x%02x -> status %d" +usbredir_server_intr_stream_stop(uint8_t ep) "stop_interrupt_receiving ep = 0x%02x" +usbredir_server_intr_stream_park(unsigned ep_nr, int len) "parked IN packe= t ep %u len %d" +usbredir_server_intr_stream_complete(unsigned ep_nr, int status, int actua= l) "ep %u status %d actual %d" --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611581; cv=pass; d=zohomail.com; s=zohoarc; b=fF3WfgXWybx8CgbvA8XT/W/+Lza48YMNFVUODEpHB7FuuJ2MP1kpLNnHT9owQNlAut96pH6yu1GrZDhkdjp3FycKGj6r3LuxzSVhNdn0XIbC4jTleXXXfl4T/L6IXQ9FPJb9ga4jPgwrh2TtFO9xPF2XXESyqEWrYZzxqQjmGT8= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611581; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=5Qhp608D5co/UuxDymwZKOtSDGY4WQCexBrmKwma3kU=; b=Kc+9FuMIL8hStVNF3HVX8Ne6s9h3oVZOM6o3vrXvRWRdAKlpJuYi3QD+254BLmsd1Clv8lagaiwVt3Ovrp61PqH2bSb/nWb8R6O61pcfoIWRdmzerDpXsCPBHXbKHcPjsoP183fuhrJ+Q3LfBuvfovfpzhbTfGwAXGB8HilEfgM= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17936115817884.323491652604275; Mon, 2 Nov 2026 01:26:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGP-0007iD-1p; Mon, 02 Nov 2026 04:23:37 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFr-0007Pb-Ks; Mon, 02 Nov 2026 04:23:06 -0500 Received: from mail-japaneastazlp170130007.outbound.protection.outlook.com ([2a01:111:f403:c405::7] helo=TYDPR03CU002.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFg-0000a4-1i; Mon, 02 Nov 2026 04:22:59 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by PUZPR06MB5956.apcprd06.prod.outlook.com (2603:1096:301:113::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:32 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:32 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UHfvjTkv/aKHr523+k5k9EVdcVXyVdG0pf5WI0o2jFVWnziJEb6rksfjhu0UkPWivKvTHgUzmbr4xeA1OCe14a8B8mI8VOBZnsJMvscCK0xthJX1YxTiaC4G+pXSY4KK5xeuTKoSsbqZgSkCMRK9acJtuFc8z3Mf2k1tYxJCSGCZwUa32Tj5SvbU+NskIxF5yrGTEr/xGptoFj1ZIvrnEulTIiSYEulFg1sve+AxY7vlGMkVp8Q1JY092+a2nWZ/XgG9JyDjLBUOHVmxITvpMzYzRgXJa4bZuDyec2NsRTsAdcc2DJkt0NWWjDIPLta8N8CwoUKErG1Z3qcJX5UhyA== 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=5Qhp608D5co/UuxDymwZKOtSDGY4WQCexBrmKwma3kU=; b=FFqwKu97vsrOqh22J+vFcTO+CksOJtZrBUhAeYOP/3kO6pYoFrj8gs6T5QpK5UbtKjzifga+2BJJdGpigLPqnFFPUbgQr/3w1+tIIFMxNRUp7W+/iCmS/lmpRdZ/NB+aN4m5knVM0V1jGPFevdJY+rbDYKlt7x0WdIj8q7e0VldmWH+WR/JhwSYIJvpTSMcfITK4q0B3STr1AT6otvC0y1dsIwlDmUbDHtCvz7iVufeRRtxpHBL1/w9ikI51/3pfdBMkkFFvRsQ4BgKMwcQSmGuO7ToJ0WZ7AC16qLSSseWp0MIjMgyFWt/U6lM9PL3HMyUsB1++mFYGYa13yNM8FQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5Qhp608D5co/UuxDymwZKOtSDGY4WQCexBrmKwma3kU=; b=l4R8B3JBCjJ7HFIG0r0Z+CagXaIxqly0rKsncVEtxIXupHWwZZJFPkBsw4Jafg8FilKWZrO2F+Rdlo0GIexzcd3Ho/thS2FDC5xzbmLin60y4X7upyRZyPBk48NtIIxdRGM676bzR2SsTsri43UOoPdNgAUdPmMkWJX6v11Yj3Yj0fEEvEL0Nl6lJlylqxh7B67lkL6rBfroN8PNekqdlhSbfDz+zLvhIbaBnAgO/xPNGAWl043L7BX9EyfYg3lxLVFLhZnH2C38YV/2SPuDPdRKHr3f6s2Z/y+IdLWJeEkObNT92aLwWLMLJ0NV8yTKGmkIqd6l5ruK+ybBMjN+qg== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 17/18] hw/usb/redirect-server: Implement isochronous OUT transfers Thread-Topic: [PATCH v8 17/18] hw/usb/redirect-server: Implement isochronous OUT transfers Thread-Index: AQHdaqut1wStafDeY0CrkssiAVRBhg== Date: Mon, 2 Nov 2026 09:22:27 +0000 Message-ID: <20261102092201.1729245-18-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|PUZPR06MB5956:EE_ x-ms-office365-filtering-correlation-id: 9af75636-510e-40d7-9bad-08df38c2d305 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|7416014|376014|366016|1800799024|23010399003|10067099003|18002099003|22082099003|3023799007|921020|38070700021|56012099006|5023799004|261021133027099003|261026135527099003|261021121427099003|261021130227099003|261026130827099003|261022115727099003|261022113327099003|261022075727099003|261026121527099003|261022105027099003|261026140227099003|261009221227099003|261009223027099003|261028144727099003|261021123027099003|261021135927099003; x-microsoft-antispam-message-info: KJKDLW41nS7jNiXs9DcYsU3ANJkntWCSq/ob+S+D+IUnOX19wE1ARh4Xw/QkES9cw2FXTeQ0S75jIkwoNevBH+tZYGzNr8eeVc+f2x7/OINc+OnYuec3YTU7umVUj9CzxmPQA7W9gRFCy5GGPlAtY7CJP/17Y+4R+nbpk+ARkAVjW9kdoqkEao+dreB75gdEftd9l5gFue0ymnTjw6h4EA7oCdgT3GU/zOZPCXd30JMmaJ6zAAypUjdTJevhozKL8qEArBoHRz6pzudQo1uwP8v77sC82N/Ro183krvHuOBHRD2fggXD+ufptI8YbXW+Nh1WFYdqYy6OjW2piQwupsZXdFlZ+sNpLGQzog3RKoqc/4HQm/CP+dh0zh3zHIJnfnuW15KkMA3+2IRiiaypDH/0QJ4hP+AePeEPe7o9uQ1EBHGCu7Tvs86aS4z3SBp6He6ksQOhiy8rWSbnxOON42/+HBxDP9g5D4Q/re63CzNadxI7cxxRBK+Drez7XlKyewythPxnprnJCjptf/2+MeX3bVZLEVpuwN874pwlLYpOlCFL6sbV3mOoaVfrF4roTlvYkIxr9AajseqAGjn0tz/lDyTUEChYRgBIFw3xKfpX5V3SbGLv18ExQx256zhcxR/BWnYp3a3JOy2Z8lsRD1Zu8pkt6htqzjUXKE+ykboe7vkHm2saqjKcXlIjC3pRBoGGWsaEQvOcyHyLSOILJtBjfXQdzthzLZrYJvkz8Fs= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(7416014)(376014)(366016)(1800799024)(23010399003)(10067099003)(18002099003)(22082099003)(3023799007)(921020)(38070700021)(56012099006)(5023799004)(261021133027099003)(261026135527099003)(261021121427099003)(261021130227099003)(261026130827099003)(261022115727099003)(261022113327099003)(261022075727099003)(261026121527099003)(261022105027099003)(261026140227099003)(261009221227099003)(261009223027099003)(261028144727099003)(261021123027099003)(261021135927099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?q/zBWuunlR53SxaidMgijPRXeEN9bvXWT/h5awPh9J0pwc0jraETsX9o3u?= =?iso-8859-1?Q?BF6O84zuhcMYYs76fekQVOPYsZ4IL72wiH8MQadnzesRBWLAAWNpPt+JxT?= =?iso-8859-1?Q?xTmgL1jY6YfEzsgc0d6tACD3acKS17f/QX0gYRBV5SWNMxlROpmVWUBzEK?= =?iso-8859-1?Q?YIhTJXnHpDcnJmbNJoQxJGhZcF22f7sTZXdJA97aqQEqDJqyOaIo7Ek/Vh?= =?iso-8859-1?Q?mYRl2+krPMf0A8NUaXaMQ2FbZaxojrpcGWJpTd84uXQEQXZTFYmlQ9CEts?= =?iso-8859-1?Q?3eQ23zK9YEkT67uwRqiu5JDpFsxb/IAIN6a70iBvpyyHvpDKA3CIBi1nvU?= =?iso-8859-1?Q?a3z2QZo0V+hAVtlCPAgBbaQ15M7prXdmBmRP3kIZj4uPFF63QUED0gLtCU?= =?iso-8859-1?Q?eerthvPtY5Iqpsqyvm8uurnc7CHsuugd2f4Rr7iNy9JU8S+28cVbWpLAMq?= =?iso-8859-1?Q?6ikW+gF3nkz3D1O7vvI2NeaSMiteX3/03IrcH5oNubfhfB2Qvcfvuv7emx?= =?iso-8859-1?Q?xGlukTZb0qqkcb9Vk1FMHiGkyicJ2SUhGP9alBY0P14MyDCw8ssdawm8q5?= =?iso-8859-1?Q?4K73oEPQAqC/aA6wOhhR3rTd4V0NIqoOQhnpix/GVuS+4dTOJkvvrII6Wp?= =?iso-8859-1?Q?+kmOeFZykQyr/02O7uTjFQMpJmm3Ncrwr0OZRevxy/rmmuut+bFlUK7RXq?= =?iso-8859-1?Q?5OOdbCPrZg9d9gaAsp0qS9p5qblN9j0OQ9Z8J3+4IfYUv1+L6VW28W1/t9?= =?iso-8859-1?Q?XNCYO8nHCInwOsTUMGLhsXbNOMrV+upmk0UWVLxQjIlhI0rMbjzlvNx4gN?= =?iso-8859-1?Q?2P3aGMDWn/l2Q6RwI5xmV5Ss270xR1G8aJms37MDU1xUO4TrTw6a7gYzpg?= =?iso-8859-1?Q?MIOnaNgDCQXiN0KdN10dL5JLHdTYmZ7tn9Pu6h4HT4GnCZ3QrdX8FCgdXQ?= =?iso-8859-1?Q?UJYnZuYsxLAEncmrZm4jv6GulGjj4Ne5OM2O31DHOHCbJVTwhjPFZQPEF1?= =?iso-8859-1?Q?O+cbKzU24hvx/jGU2ctoTHl1DmmXVVmNlbXZvKTU5yai6hjW9tiPR/csSb?= =?iso-8859-1?Q?YQNevelgjXI/m8/htDHqppD48+5QrbF8IEl5d+01miS/iZRbEgFts+zW9D?= =?iso-8859-1?Q?XU7kOfvMTMEsPDWauG5qckp2XzsasMOYXnQXdgrps+Ny3e8u9bOak2Pdf6?= =?iso-8859-1?Q?wb72ewWrQS3olgvKqKfZjyDifd+13VTlV2F2Qw/bjwjyQ/bc9R9skgRLXA?= =?iso-8859-1?Q?YXqtk44nFzxHsscdq7daaHJE6HZFWYVCGBqKaO+EsDYre92dDfFKehe5zf?= =?iso-8859-1?Q?g1wFaktxhNC4t7RxYEU1mLdcB1auurJYkbCB0UZbQgtutZzIoPRKtVdHNW?= =?iso-8859-1?Q?jhfTLkxwHwOqPL9zreaharwsIC/WLlaWGp27QUTYhbTb/blr7ak2oVsqQA?= =?iso-8859-1?Q?SnvJY3+Jn0aacossEPTqzVDq4cri5YqCzX3QSGgO56lNL47CChW1lx78tR?= =?iso-8859-1?Q?k5TxBV6ZNfpY9ekexieby9DUjlSZS6IViUpSlqhPaWmFJRvPXqs86fqDEw?= =?iso-8859-1?Q?CfY28tIzq754b1mFBNXRfY/niSom+ndxJsj4oN4ns0g/tRNRNgG8esHEEA?= =?iso-8859-1?Q?U/HfgrJ3iZfxOM7vlaoDtNrEX2mGVhUnPEdbuXmyuuGTUJghSgj7BMWeNd?= =?iso-8859-1?Q?2l6m/2l5dbV+0kdrJ9k+jWLMIiVf3r/wFj/DphOcdgc7n+bYTpsEVq3S3L?= =?iso-8859-1?Q?0wGnktf5hkpDW8ahDwbCAjSCBRluwvybqU+c1RiIEDa5dn7LPDa4kI7szp?= =?iso-8859-1?Q?+HAy/aTOZQ=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: uWQcss9zdZU3PP1SeHGRK2MfY+soujQcmMRJTtk6hPTpsIpbR+0NeROFkmV0kUDDx5OdBYDQhzJqzcR5zzlatxlvP92xBCB2VzYkB/eOeF2PgQXAOI5UUILvUetOEJqefEokYH/HFUXI0tfujmcAvOqM/bWJ4lpDnG7dKtn2gCF1T7W9lXTYWDj5zoHVvd+I/FF+fS9pSiBWCsKvBDlOUAiDpxE6M8z/10lbbbTEjTRnzhWnSCf5YUg+V0UYz2v6qBVzp8qvvxPsorjL5USO4cIcukyLE4DAcvVgfxG0OJfZKRWHnDb8BmhDBGVTQBaAIexM7hVH6jUF+P9TSPv/Ug== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9af75636-510e-40d7-9bad-08df38c2d305 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:27.5250 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: RgRMY/nGF8tbw5h/U2L74wkKpevuSJrQTrKzPYBUu7eCaNjGhIH28FWcHTmRjBrUPP3oJuZA03yKsUIQl6RROmDyeGs+mJ4GyyzC42Ido9w= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PUZPR06MB5956 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::7; envelope-from=jamin_lin@aspeedtech.com; helo=TYDPR03CU002.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611584882154100 Content-Type: text/plain; charset="utf-8" The protocol has three callbacks for isochronous transfers: start_iso_stream_func, stop_iso_stream_func and iso_packet_func. Isochronous has no capability bit, and the parser calls them without checking, so a server cannot leave them out. Implement the three for an OUT endpoint. Endpoint 0 is control, so refuse it. The host sends a packet for every OUT transfer. It sends nothing for an IN transfer, so refuse an IN endpoint with a stall. Only a stall makes the host close the stream. Any other status leaves it open on the host side. An isochronous packet has no id, and the host wants no answer. Report a failure with an iso_stream_status. A broken endpoint fails every frame, so send at most one report a second. A stall does not wait. A stall ends the stream, and the host has to hear it. With no id, a cancel never matches an isochronous packet. A NAK does not park it for a retry either. Reported-by: Junjie Cao Signed-off-by: Jamin Lin Reviewed-by: Junjie Cao Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Junjie Cao --- hw/usb/redirect-server.c | 161 ++++++++++++++++++++++++++++++++++++++- hw/usb/trace-events | 5 ++ 2 files changed, 162 insertions(+), 4 deletions(-) diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index cfd2bcc438..95d25b5292 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -99,10 +99,14 @@ OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SE= RVER) /* Buffer size for an interrupt IN endpoint before its descriptor is seen.= */ #define USBREDIR_SERVER_INTR_STREAM_DEFAULT_LEN 64 =20 +/* The shortest time between two failure reports. */ +#define USBREDIR_SERVER_ISO_STREAM_STATUS_MS 1000 + #define USBREDIR_SERVER_CTRL 0 #define USBREDIR_SERVER_BULK 1 #define USBREDIR_SERVER_INTERRUPT 2 #define USBREDIR_SERVER_INTR_STREAM 3 +#define USBREDIR_SERVER_ISO_STREAM 4 =20 /* Which message answers the host when a control transfer ends. */ typedef enum { @@ -128,6 +132,7 @@ typedef struct USBRedirServerPkt { struct usb_redir_interrupt_packet_header intr_hdr; struct usb_redir_control_packet_header ctrl_hdr; struct usb_redir_bulk_packet_header bulk_hdr; + struct usb_redir_iso_packet_header iso_hdr; =20 /* * The IOV points here. IN data lands in it, OUT data is copied in. @@ -169,6 +174,13 @@ typedef struct USBRedirServerEp { QEMUBH *intr_stream_bh; bool intr_streaming; =20 + /* + * Isochronous OUT streaming. The next failure report goes out at + * this time. + */ + int64_t iso_status_next_ns; + bool iso_streaming; + uint16_t max_packet; uint8_t interval; uint8_t iface; @@ -724,6 +736,47 @@ static void usbredir_server_intr_stream_complete(USBRe= dirServer *s, } } =20 +/* + * Isochronous transfers have no answer and no retry, so a good packet + * needs nothing back. + * + * A broken endpoint fails every frame, so we do not report every + * failure. + */ +static void usbredir_server_iso_stream_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + struct usb_redir_iso_stream_status_header st; + USBRedirServerEp *ep =3D &s->ep[rp->ep_idx]; + USBPacket *p =3D &rp->pkt; + int64_t now_ns; + + trace_usbredir_server_iso_stream_complete(rp->iso_hdr.endpoint, p->sta= tus, + p->actual_length); + + switch (p->status) { + case USB_RET_SUCCESS: + return; + case USB_RET_STALL: + /* The stream ends here, so the host has to hear this one. */ + ep->iso_streaming =3D false; + break; + default: + now_ns =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + if (now_ns < ep->iso_status_next_ns) { + return; + } + ep->iso_status_next_ns =3D now_ns + + (int64_t)USBREDIR_SERVER_ISO_STREAM_STATUS_MS * SCALE_MS; + break; + } + + st.endpoint =3D rp->iso_hdr.endpoint; + st.status =3D usbredir_server_status(p->status); + usbredirparser_send_iso_stream_status(s->parser, 0, &st); + usbredirparser_do_write(s->parser); +} + /* * USB port ops */ @@ -806,6 +859,9 @@ static void usbredir_server_packet_complete(USBPort *po= rt, USBPacket *p) case USBREDIR_SERVER_INTR_STREAM: usbredir_server_intr_stream_complete(s, rp); break; + case USBREDIR_SERVER_ISO_STREAM: + usbredir_server_iso_stream_complete(s, rp); + break; default: g_assert_not_reached(); } @@ -845,11 +901,12 @@ static USBRedirServerAsk usbredir_server_ask_device(U= SBRedirServer *s, =20 /* * Keep the request and send it again when the device wakes the - * endpoint. A streamed request asks again by itself, with its own - * timer. + * endpoint. A streamed request does not wait here. The interrupt + * stream has a timer of its own, and isochronous never retries. */ if (rp->pkt.status =3D=3D USB_RET_NAK && - rp->type !=3D USBREDIR_SERVER_INTR_STREAM) { + rp->type !=3D USBREDIR_SERVER_INTR_STREAM && + rp->type !=3D USBREDIR_SERVER_ISO_STREAM) { trace_usbredir_server_nak_park(rp->redir_id, rp->ep_idx); QTAILQ_INSERT_HEAD(&ep->waiting, rp, waiting_link); timer_mod(ep->retry, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + @@ -1513,6 +1570,93 @@ static void usbredir_server_stop_interrupt_receiving= (void *priv, uint64_t id, usbredir_server_intr_stream_cancel(s, ep_nr); } =20 +static void usbredir_server_start_iso_stream(void *priv, uint64_t id, + struct usb_redir_start_iso_stream_header *hdr) +{ + int idx =3D usbredir_server_ep_index(hdr->endpoint); + struct usb_redir_iso_stream_status_header st =3D { + .endpoint =3D hdr->endpoint, + }; + USBRedirServer *s =3D priv; + + st.status =3D usbredir_server_ep_status(s, hdr->endpoint, + USB_ENDPOINT_XFER_ISOC); + + /* + * Only an OUT stream works here. Only a stall makes the host + * close the stream. + */ + if (hdr->endpoint & USB_DIR_IN) { + st.status =3D usb_redir_stall; + } + + if (st.status =3D=3D usb_redir_success) { + s->ep[idx].iso_streaming =3D true; + s->ep[idx].iso_status_next_ns =3D 0; + } + + trace_usbredir_server_iso_stream_start(hdr->endpoint, hdr->pkts_per_ur= b, + hdr->no_urbs, st.status); + usbredirparser_send_iso_stream_status(s->parser, id, &st); + usbredirparser_do_write(s->parser); +} + +static void usbredir_server_stop_iso_stream(void *priv, uint64_t id, + struct usb_redir_stop_iso_stream_header *hdr) +{ + int idx =3D usbredir_server_ep_index(hdr->endpoint); + int ep_nr =3D hdr->endpoint & 0x0f; + USBRedirServer *s =3D priv; + + trace_usbredir_server_iso_stream_stop(hdr->endpoint); + + /* Endpoint 0 is control, and an IN endpoint never streams. */ + if (ep_nr =3D=3D 0 || (hdr->endpoint & USB_DIR_IN)) { + return; + } + + s->ep[idx].iso_streaming =3D false; +} + +/* An isochronous packet has no id, and the host wants no answer. */ +static void usbredir_server_iso_packet(void *priv, uint64_t id, + struct usb_redir_iso_packet_header *hdr, uint8_t *data, int data_len) +{ + int idx =3D usbredir_server_ep_index(hdr->endpoint); + USBDevice *device =3D usbredir_server_device(priv); + int ep_nr =3D hdr->endpoint & 0x0f; + USBRedirServer *s =3D priv; + USBRedirServerPkt *rp; + USBEndpoint *ep; + uint8_t status; + + status =3D usbredir_server_ep_status(s, hdr->endpoint, + USB_ENDPOINT_XFER_ISOC); + + if (status !=3D usb_redir_success || !s->ep[idx].iso_streaming) { + trace_usbredir_server_iso_stream_dropped(hdr->endpoint, data_len); + usbredirparser_free_packet_data(s->parser, data); + return; + } + + ep =3D usb_ep_get(device, USB_TOKEN_OUT, ep_nr); + rp =3D usbredir_server_pkt_alloc(data_len, idx); + rp->type =3D USBREDIR_SERVER_ISO_STREAM; + rp->iso_hdr =3D *hdr; + rp->redir_id =3D 0; + + usb_packet_setup(&rp->pkt, USB_TOKEN_OUT, ep, 0, s->next_id++, + false, false); + if (data_len > 0) { + memcpy(rp->data, data, data_len); + } + usb_packet_addbuf(&rp->pkt, rp->data, data_len); + + trace_usbredir_server_iso_stream_packet(hdr->endpoint, data_len); + usbredirparser_free_packet_data(s->parser, data); + usbredir_server_submit(s, rp); +} + static void usbredir_server_alloc_bulk_streams(void *priv, uint64_t id, struct usb_redir_alloc_bulk_streams_header *hdr) { @@ -1542,7 +1686,8 @@ static void usbredir_server_cancel_data_packet(void *= priv, uint64_t id) * A streamed request comes from us, not from the host. * The host has no id for it, so a cancel never matches it. */ - if (rp->type =3D=3D USBREDIR_SERVER_INTR_STREAM) { + if (rp->type =3D=3D USBREDIR_SERVER_INTR_STREAM || + rp->type =3D=3D USBREDIR_SERVER_ISO_STREAM) { continue; } =20 @@ -1627,6 +1772,11 @@ static void usbredir_server_stop_transfers(USBRedirS= erver *s) timer_del(s->ep[i].intr_stream_timer); } =20 + for (i =3D 1; i < USBREDIR_SERVER_EP_IN_BASE; i++) { + s->ep[i].iso_streaming =3D false; + s->ep[i].iso_status_next_ns =3D 0; + } + /* * No "cancelled" response here. This runs on a bus reset, a detach or * a closed chardev, and the host has dropped its own queues already. @@ -1676,6 +1826,9 @@ static void usbredir_server_create_parser(USBRedirSer= ver *s) usbredir_server_start_interrupt_receiving; s->parser->stop_interrupt_receiving_func =3D usbredir_server_stop_interrupt_receiving; + s->parser->start_iso_stream_func =3D usbredir_server_start_iso_stream; + s->parser->stop_iso_stream_func =3D usbredir_server_stop_iso_stream; + s->parser->iso_packet_func =3D usbredir_server_iso_packet; s->parser->alloc_bulk_streams_func =3D usbredir_server_alloc_bulk_stre= ams; s->parser->cancel_data_packet_func =3D usbredir_server_cancel_data_pac= ket; s->parser->start_bulk_receiving_func =3D diff --git a/hw/usb/trace-events b/hw/usb/trace-events index 6eb47085d0..642f42c864 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -427,3 +427,8 @@ usbredir_server_intr_stream_start(uint8_t ep, int statu= s) "start_interrupt_recei usbredir_server_intr_stream_stop(uint8_t ep) "stop_interrupt_receiving ep = 0x%02x" usbredir_server_intr_stream_park(unsigned ep_nr, int len) "parked IN packe= t ep %u len %d" usbredir_server_intr_stream_complete(unsigned ep_nr, int status, int actua= l) "ep %u status %d actual %d" +usbredir_server_iso_stream_start(uint8_t ep, uint8_t pkts, uint8_t urbs, i= nt status) "start_iso_stream ep 0x%02x pkts_per_urb %u no_urbs %u -> status= %d" +usbredir_server_iso_stream_stop(uint8_t ep) "stop_iso_stream ep 0x%02x" +usbredir_server_iso_stream_packet(uint8_t ep, int len) "iso_packet ep 0x%0= 2x len %d" +usbredir_server_iso_stream_dropped(uint8_t ep, int len) "iso_packet droppe= d ep 0x%02x len %d" +usbredir_server_iso_stream_complete(uint8_t ep, int status, int actual) "i= so ep 0x%02x status %d actual %d" --=20 2.43.0 From nobody Thu Nov 5 07:28:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1793611437; cv=pass; d=zohomail.com; s=zohoarc; b=cT2CzGImzU32BQy4FZtKLuySOVl00AWId9AoBpmGUaIE+NuoEEjdiaePJAcTOQXmJDq5lFWJD8+/qdiXnAD/KV3dSyoFW+awaIYNhPsHVcu/LZaCYm4CAiFH9HoQKqV92hrTTCX0SIV5dQ3qrVDT65brSYqytIHP2piLhAagVeI= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1793611437; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JyKnVcNB9bb9Oppe6x9bCVeam2Cwo6wbpr3zl72AnQA=; b=ML8IfQ/jnpT8xDqVnWc0r09DulU6sKHd2iH8crhAeviyULqmf7y80H3PSl2ei9AeWVS4YBMOlLfuPIj7Lf1UsQlaAIX4GA9JxVl9tgWXUM/9w6VJ3wsVDzD7Bnr707ftMEe2/pXGZvT280OLA7aPRGxj6tIu8Fe8FYBxmm4tbKs= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 179361143616877.90212250378215; Mon, 2 Nov 2026 01:23:56 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xNoGM-0007g9-VG; Mon, 02 Nov 2026 04:23:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFS-0007MZ-WF; Mon, 02 Nov 2026 04:22:46 -0500 Received: from mail-japaneastazlp170130007.outbound.protection.outlook.com ([2a01:111:f403:c405::7] helo=TYDPR03CU002.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xNoFR-0000Zj-An; Mon, 02 Nov 2026 04:22:38 -0500 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by PUZPR06MB5499.apcprd06.prod.outlook.com (2603:1096:301:100::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Mon, 2 Nov 2026 09:22:33 +0000 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6]) by SEZPR06MB7362.apcprd06.prod.outlook.com ([fe80::cd2d:35d2:a702:1de6%4]) with mapi id 15.21.0592.007; Mon, 2 Nov 2026 09:22:33 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=g1ZdZguM1FQ8vg3SJzFhwzJQzqXL+3hM9/AteQ8nO88AxdPxKbth8atPNjW4TDX/IlP/kEZA0rnjvcx28JOFi0RzWkw5t4dMM7AVcrS7aUpgKBt8aBg7KSIBbjA/W5HaVpMqh9p2GErJgkN/HrZQb4JkUrzWfb0FPiLOmT1Leg/pIZhhxUEDEy12IVbIc09r2BQ3H/CBdzTrf2LkENUMOlnXmcCILqs0m/caU63HzTIqgoS7m4bQFAj6PeWlVKUYgF22si6LA83Er2gEqXc0sp3MjDV+YUrOcFbKWPO+U77aoTEQqrkk0qjhs4rkRzvTSiqM7nKGMyOq9Y/Vhdwtfg== 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=JyKnVcNB9bb9Oppe6x9bCVeam2Cwo6wbpr3zl72AnQA=; b=e9Q0kdAMJix+6G9jmTifqM5W4fYwWqnD/Y+ZyRIUmZ72lTSe09WSHBur+kS+xifIVqXgjXFcfBnLxPsZU47hjUQHXU9qybo4NoAy3+MTSY+51NYwyqBytIZDHR92Eu2New06XXNcSK5zlmjSD5hxeWgi5AQLjpjej/imCPHFm05a2UQf6phJeHuxo3UHIBhsQ1DR44rQHEHTpK+AY414+EDwHeCRp2dSNyO6ReN96p+E8TAXkcz25qEgHyvLk85wVG9NbjSrpjyGWmMhTt13KmWQmtCkIC/rbojJSBVr3U7dni0C+xw3t73lTlpnUd2LC3kLAg1HTXszi2eYWRHNfw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JyKnVcNB9bb9Oppe6x9bCVeam2Cwo6wbpr3zl72AnQA=; b=ZsoDF8georuT7bruHA7iGarg0w8PIwhCl3uWOqGVNI4vyEdTp9sqRq8MqUcET7jgWWgk2LKDvE9p5BX0DaqSHopW2O+FOBNOTc/K7kl+g1biccUym3WuxmlcoXIVoyxUT/9k0GWputfyQafDdqpqULR4gMf5pnpNX6knYJsgyj5Bjo5vqxr7vhJNv1wjrEWe1kzGfaWQgFHf82YQkAEammjIGgne+nJmy+R6M8L0Us/Vm8xtRMvgENBX/PRMgUVkwSUcUJ0TSpj0TpS+/FsSykoAUs/pTOF0ZYBt8zFnhIl6rxGvmyScLEYXXyaaTphQ4uvFZSPb28rS+2EyO5CqPA== From: Jamin Lin To: "kraxel@redhat.com" , "marcandre.lureau@redhat.com" , "junjie.cao@intel.com" , "junjie.cao@linux.dev" , "clg@kaod.org" , Pierrick Bouvier , Peter Maydell , Kane Chen , =?iso-8859-1?Q?Philippe_Mathieu-Daud=E9?= , Tyrone Ting , Hao Wu , Zhao Liu , Richard Henderson , Helge Deller , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , "open list:All patches CC here" , "open list:ASPEED BMCs" , "open list:X86 Xen CPUs" CC: Jamin Lin , Troy Lee Subject: [PATCH v8 18/18] hw/arm/aspeed: Enable the usbredir server transport Thread-Topic: [PATCH v8 18/18] hw/arm/aspeed: Enable the usbredir server transport Thread-Index: AQHdaquuxEBCsVxC+0+Qv5Y70HdBCQ== Date: Mon, 2 Nov 2026 09:22:28 +0000 Message-ID: <20261102092201.1729245-19-jamin_lin@aspeedtech.com> References: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> In-Reply-To: <20261102092201.1729245-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR06MB7362:EE_|PUZPR06MB5499:EE_ x-ms-office365-filtering-correlation-id: 3d81c971-c3f4-4ac0-9dfd-08df38c2d375 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|7416014|376014|1800799024|23010399003|366016|10067099003|18002099003|22082099003|921020|38070700021|56012099006|261021121427099003|261026121527099003|261022105027099003|261026140227099003|261009223027099003|261028144727099003; x-microsoft-antispam-message-info: 4qhBorJ1GBAsHRVUtZvMsppGz8DJbbJOtD5qBDIhFQ0uaLDqkIclcj++HLU1K+FDmxM4X2dIBijuxr4RZdeBjS+64qlfk0XD+Xdrc/58Fo26U5ehcTr2VcrwHFUiFyj/enSfw8Uu8UqR7Nxy1+fKOrKrMdsPrH16WlvC16q6gwrGnN7fG4KsegCt4UxirLWmAvKbcakdobKkVZ3SknuG4ZGPD1K7EqI8B1zKrMyPClH+/wRaGw0mbvWdqy8aHOqJxNxWrt5cbeYIo6AlDaVfgcJS77msrrWJ3837CEj9d5LvGQ02Qg93SseLfxSQ1DIHOGaZkG8RN0pomfk4RgKBMmywGJSI0o4r/NXlmAxnEIa7YXqKG0/kFJQEp23BmNcCxPdDXo4weDtehsREPxNeABHc8ZEwGCiQedblv+aErF8/VZe2iIppCv8xESTJLgkhJRykQLSz8eHe/YWFVK+7S6h7xhqUXr8rMGVWlWPJ3e4fZm18o5q/cnGKxMbj6Hi6mDWRfWlVhaN2QtmpzMPytTYOKxYytiF2Pll5Kb0xbScFU7un5SgVUSXYCKpNlXCIAWXG4hs52AKwlzt9XGvS+Kr6TpOaSxyQjgH/4EWPOEUxrMtKt/psOy3p2Dsu6SIW3JqkoeKWg7Gkd24bcEy3CSUyr2dUIJb2ERlVsjXOZCnnQU2txROKk6jMSMIl2xb5NU9OinPEOTyaQjorB+m2E33QViD/vOAzyem4FyZP8mwbdg2/YkB+VtcRrpUlYAEn x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEZPR06MB7362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(7416014)(376014)(1800799024)(23010399003)(366016)(10067099003)(18002099003)(22082099003)(921020)(38070700021)(56012099006)(261021121427099003)(261026121527099003)(261022105027099003)(261026140227099003)(261009223027099003)(261028144727099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?Toi23wnPtI1S9NOLSzhYbyBc5d5RdQNPvdTWdVfRbEFSmkYeSO51MmQ1zn?= =?iso-8859-1?Q?bg4xFXMJLqEll3cYoiP9RXc1XNd1fg7cLaSesZs47XW/u1se0bjQ036uoC?= =?iso-8859-1?Q?Iu7rA38I5GBOIpTxxri5s2LxioP128LVBfoTnxchqb78nqPKYr1wlc3tL2?= =?iso-8859-1?Q?mcZIyymDtd5Yrar07Evpx0a1sHhDPWs/zz7FSbbFyERm9RrT4U0CRoxoCi?= =?iso-8859-1?Q?wTabnhwkqSvb/PPFeyBNR5cQHWK5Sf4OH/ng5OFWXP/vJq4ep8qYSQv89O?= =?iso-8859-1?Q?CEEJAh3dmmn8ZJ4v/uijra0DKQN4YVShqJGCzsoMQ2PD61FSUuNF3k3A+r?= =?iso-8859-1?Q?SS71X5aKZjP4221vu+x1eEzzHFaummrWh6hTDKviDNnXBJZmXvr4N0pyUu?= =?iso-8859-1?Q?YOl+I7sMoCBBM9evgI5/JdED+d1BoUNx3XzWMUrAS9uRWq5/IfzLJl6HeJ?= =?iso-8859-1?Q?aHdwdJC8gQqf8evIjooeIadJwxrN1ltFbA1czKIKFaV+pzbcEQR+3nBO75?= =?iso-8859-1?Q?A3W9jK8ULhxen5tX6FawIIxDuXBBwla65DTTDb7GAdeHSm0LZg2FRuacTL?= =?iso-8859-1?Q?yTMBAaR3wcuw0G09yJB798ZOU/fmZQV0oAO7MMB9RaK0MeKV+JuXL8Y8Ng?= =?iso-8859-1?Q?aJjw5l1uRiFXI12CyYGbIeA8iYBHIBsrlLqT+ElI5Mt8HEdVZDtGcqiLXp?= =?iso-8859-1?Q?mfS26MYlZFNtD/4dCiIwB01oCfsj4WrYYgqHpi0+PAhBuZLuR8k5eLsCCW?= =?iso-8859-1?Q?BRzH8oLBcW9KsfkYrUIrSBa5mFV/ipT6ohrefaftULds5pz+SXqw9m6ygg?= =?iso-8859-1?Q?xxNipybjYvMs4JjUkaKQ1MUDz0DPONcBNPwxhCaD75chw4u0guSY3KWsGG?= =?iso-8859-1?Q?/bVuI1iaXUh6MJtLKIBAoB8/OlWc+uZ1c7ifUXc6vmpOeLuqS+h4mDU1mr?= =?iso-8859-1?Q?D1EjrjMPt3e6WfS7AxN3yYQ2KMbAfSRsWWDBhojeVAUYI7ULB0ZX5J6goS?= =?iso-8859-1?Q?UWV/l5x6eNo9TJid3iJdAH62Q/AcVokX/3dUi+W/MciNTIn2/xFG0xUk12?= =?iso-8859-1?Q?9DJQsxkzqT0jr0REi6axLSL+BHquzRvvff2WC7wVj/hyBcwF+5J7K+F0t6?= =?iso-8859-1?Q?SwRDf82DpGdKZhNdU+AJlGrh6VnjeLehoJ+b7V9eXzp2BUYKjexzMewbXf?= =?iso-8859-1?Q?rF3zZsCgX5/Lm0RaHvn54HjKWQGMXpxhdeJF27MtSDch/h1/eUaZpei7t3?= =?iso-8859-1?Q?tVPRYccjzjedYIcXXtOaKgj7icO8AmN6A4GI5MG5cIFreSoB63ulf8pvam?= =?iso-8859-1?Q?+rYd5kogxslfHdq0tqHUd4THqcCH0Ogp6pHx1a5zda5od3Td9d6kc9oGbV?= =?iso-8859-1?Q?qxRtqvRHXhkx/Ekbzocuq+iBvQup8xDqL0cq+Z6rzQUXiDdnutyNefREtC?= =?iso-8859-1?Q?0vX2KS70BCvujBOKYvNFx8d29fWreYsBvEzZX1n6/e2io2THTWjaUAW5ni?= =?iso-8859-1?Q?iYxcyNg/lgDWhhMmT01abEUN6Rsa3lH8gpX8I5//E/rO0iTJTEcQ5U3uJ/?= =?iso-8859-1?Q?LxJU0wnK0Droez+UoRTW0OXpZ9ILbMScct0O9Yu5m/X/kHdI0oZHSejwvf?= =?iso-8859-1?Q?HQI6kjgGY/v0bmv9YXP5KBGM1tQu3SYldK+iez/BmRy/aqzU7UPxN1Xv2C?= =?iso-8859-1?Q?L69SnWtgID2mNz1BydeJvIjiQ5A9uPi1gJaSw+/tbtCK+pbvONM58KbdYa?= =?iso-8859-1?Q?sQsDJDZtludT6kMwjpwPI3SdTWI5rF1C7QF/ip+Hk1rSU4IUm5ExjdZ4oH?= =?iso-8859-1?Q?k4Bi3PL/dg=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: RGoginZbfwSbovwo/gOReTFogX/Pdo8biSbUqboJyGy9FW/ZM8I42ikzv7avNYmyheSZjNHhhTfdYuRVR9UT021GeSq0OXUFbYqfcT3zJuupMXBzPNj9ZC6ejDt0QXfUuq2gVcLkmhBEemIcnv8tRFxHCs5VOIIYGVDSlfiKLVumPtJGDym+Z7Odgs9U+qsT9GeMrq+A2OPmpbn65IpaYyNK61nzt4YCEO7iGTBoZogZzGbq+U/NNvlg6/e0bRUWsWo7Yn+21R+vSrtB0asVsiS2xtE6r9VmTtLzfSxHvacWRzl3XXQe+XO94KIU8lClZszcSjffc1xkGyRsoy+cjw== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR06MB7362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3d81c971-c3f4-4ac0-9dfd-08df38c2d375 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2026 09:22:28.8273 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: M0An+H7xYd0rRp5QNFgX8uhGuPZwEwNYqM75LQs0PDOkfAeNf9m0gC2tgZXSrCCJkEiRgGkSLkJFKJf6slktGUg6UWDEAyvL7DyPVwh+QuU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PUZPR06MB5499 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::7; envelope-from=jamin_lin@aspeedtech.com; helo=TYDPR03CU002.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1793611439693158500 Content-Type: text/plain; charset="utf-8" Let the ASPEED machines accept "x-usb-redir-server" with -device, so a UDC gadget can be exported to a USB host running in another QEMU: -device x-usb-redir-server,id=3Dredirsrv,chardev=3D -device aspeed.udc-gadget,bus=3Dredirsrv.0,udc=3D/machine/soc/udc x-usb-redir-server sits on the main system bus so that the USB bus it provides can be found by "bus=3D.0". That makes it a sysbus device, and a sysbus device can only be created with -device if the machine lists it. Signed-off-by: Jamin Lin Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/arm/aspeed.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c index a7cfbd6c5e..fc27ac1788 100644 --- a/hw/arm/aspeed.c +++ b/hw/arm/aspeed.c @@ -409,6 +409,13 @@ static void aspeed_machine_class_init(ObjectClass *oc,= const void *data) mc->no_cdrom =3D 1; mc->no_parallel =3D 1; mc->default_ram_id =3D "ram"; + /* + * Lets a UDC gadget be exported to another QEMU instance over usbredi= r. + * The type name is spelled out rather than used through its macro so + * that this still builds when the usbredir library is absent. + */ + machine_class_allow_dynamic_sysbus_dev(mc, + "x-usb-redir-server"); amc->macs_mask =3D ASPEED_MAC0_ON; amc->uart_default =3D ASPEED_DEV_UART5; =20 --=20 2.43.0