From nobody Sat Sep 26 20:00:47 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=1790067794; cv=pass; d=zohomail.com; s=zohoarc; b=AUCjBWmZHr/cYhoes2xMLGppwUF/16apTI3MNyD2qqtqldTqmQDczcuOlWtAhzYVGUj8B5Jtof1IVo8OCodNoOFArQn+b12btrdRaSq/iLPPOFFfoj8sx+NhRIvFk5neg6ChDd7+d0NlZgySzdVZFMCij84B8sEmR4OGP8GWM1E= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067794; 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=ZQ307OHFOzN2qI+AqHJoQyNgJxibnghKMYIAWEylz80=; b=aAKCkDMXNp5qEa+xhaevsv7cI0IMYUPr5tRq5E3RK2mp/PJ0i9bGujUqIZYWsZAlsGaXel6UVvUksk1Dv0PT9Zs9nDUH7e/ZOKwOEvk8ZqIyq5sDbD6QiJG2cQMB+9sqglhzFjaoNF+kwWWu+YIpgBELZ1MltWqV9RaP6l2wj/A= 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 1790067794377998.1806672497438; Tue, 22 Sep 2026 02:03:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOF-0007Tf-05; Tue, 22 Sep 2026 05:02:15 -0400 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 1x8wOC-0007Sm-Md; Tue, 22 Sep 2026 05:02:12 -0400 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 1x8wOA-0002Bc-UM; Tue, 22 Sep 2026 05:02:12 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5090.apcprd06.prod.outlook.com (2603:1096:4:1a9::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.15; Tue, 22 Sep 2026 09:01:59 +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.0428.015; Tue, 22 Sep 2026 09:01:57 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vR3wAjDky8lyxjjD6/G0Wz9covtQSE8LRBm1Ci1Uk+iYKcA2MDEfTHt12dfKN+g6mou8zaGoVjjFz1tkUc5sVQyB5VRx19ZTH5LZ0ysNPsuhrQy4flrqZdFhTXH/jJIoPvdHnEjaTg/TItGcpjMYRvrv2P5rhwVh1dzKGY59j3uvtmRrgUlo4u8+CoOGeV3AF4c1BcO8r22kOFzoIKbNezvKkJ/hpsA4d0/Mps59XLUKAJsn69lwNFY2g0gq6PwS0VN2OoOF/UsInkNIqH9EWh8dy0aZ0Fu5eJ6vol8NKno4l74u9onR1z3Jxz40ctU0uEz2bk8fsoSIcsvTbNydWg== 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=ZQ307OHFOzN2qI+AqHJoQyNgJxibnghKMYIAWEylz80=; b=BDYeaVe1OOC4neAazYqMFEeepsvORysDlra7P1dQqYKpwnFHZsUQz1SxCma0ZTnAlrn23pWABVoBECnPTStg5DHfisy6T9WNybF7rPzaec0vrksx6U87YnUCw23UkzuMsH+28yh46j1q5yV9x0ZmS1mWP2+t6m72X9zuYYTBuBTpXDiDPS3gN2tbuXuCN/rfcdxgDYrHLR1h9dV63FxcGdzyIdwnfijcb8Vo0FW1xOwBivDFwCJZpjIYIcXJ9UQe/PQHJMZlh2ZCdMuU+fMZ8PCW/noagdB6vhP0afzQVbtoLifGrq/FgFEUkykW1iN5iYxJ8/gJ3MFnFttLsqUMWA== 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=ZQ307OHFOzN2qI+AqHJoQyNgJxibnghKMYIAWEylz80=; b=PZY0jP1tLiRagjFZCVInC7xzbc88NRp4AqbLoIkTUaJFJj4/WTuFOYWcMvY4jtHnbGqdhgAqOLG62pKLkFy8GKv27DAskMv8/hfehz3etc8FATWlpDS0zxKlD8s10M5n4EdRG43ard+OCwrwFRDnMsfXt7JORr7bOUD4NQU8BZ4NBVIFURwuINc94U5LtCpXe1DT3PXZX6w4ifbTFsUwyM8FxmblVFSnBlLdj3s1wmOqnCAvSUGLeR/zMcxk4/nn/rFzjfCIXnRSJUysOYS0Q+9I7DMngvQ1cJicGwXUeRCmE2Mo+Gox7vCX2zsKosK/olUqKv0Vy34wPo4U2oMiDA== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 01/19] hw/usb/bus: Let a bus opt out of automatic hub insertion Thread-Topic: [PATCH v1 01/19] hw/usb/bus: Let a bus opt out of automatic hub insertion Thread-Index: AQHdSnEFQ4FVALEpsUClDcIg7oFjqg== Date: Tue, 22 Sep 2026 09:01:56 +0000 Message-ID: <20260922090154.1792077-2-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|SI2PR06MB5090:EE_ x-ms-office365-filtering-correlation-id: 545696db-5d85-4a86-ac85-08df188827ad x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|23010399003|1800799024|376014|366016|38070700021|56012099006|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: LTjrUeSxKvRbKsmxMkk06liV99UWRY7Fyki1oe6MTQIqSaniKSXuSaL2pO0eVATzEmGsOsoixS+34IfBwWMMnHNR051aZnFmeU5Y/32RfIwKSUUjV1yxpOWF1vn/irlOVkKavkt50ErV6pNUkK4lUd7i46aMMEImNjMhxm2KA3BlysuVRpyJ8QpnQwyWUlFfDlcgXFeQr3WVZ3GVaRppWsrlxl3H9KEt8+bSbOip88mU3Nc0Korgt47+2KnW3yvFCAPK87EaapjfWeZHwvPlV3+RKEZ4CphXoCus5QeLxLxtO1h2mX7kYm4dLRt6JUlQvR1wA/Q9tsGRWSI4yXEmA2mgNM6bippPp/ZcbEU5kOObRoEwaPec9tB1bq8A44GgwEE+fVzhuDMUI4gN3iCLE+6g/NBJ7rpHPDTBSeJmG9JcUI4ghN8+4/ml94hU/YsXvayMc/KwfQxvPZA/Knyqnw+sKw1VHoDjC3woUM+2iM7uH+IM57JIiXj/ZRFGJ/AK+iWuRlp24//afutqrSCpenhat7kwtjLuHevn9W8HYLrxZrd2MhXv1nMgoMohjVBax/Dj6wvFvUS+aGyeLHAf8GYdvvfjE3GpJpMdx/4hFQCqwQYAyA8IOyGnmqXV7IKm8l6KeCowe7EX6nRsSbGcXTLF7ViQshHlz/LTmt7BGMRgVz4mo4cIcRTL2trjsU0mNAujlv0VrtGRhXQe/XXfjNiwImbZ/+g7XolegTIMrcI= 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)(376014)(366016)(38070700021)(56012099006)(10067099003)(18002099003)(22082099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?kGrma+BgWKWLTyNLm3cp6GFzlGhwr3idi1Dt1C23CDYTKytW30zsF/bQ1V?= =?iso-8859-1?Q?Yu/3xHX4jenK5DVMLcz7Z0HYXrUYOZFgL2kaIxPc6Z/GouC3h4NwMh2rWS?= =?iso-8859-1?Q?+uo75O8WUomP7jL9+PzVeXwI6CB/73FGWE51ZCB/Mmukg6IvfDM8ZW6vWt?= =?iso-8859-1?Q?dgcsEG56h/Ek9hlK6jaV+twKtYCtdnE7tUK2pH73xHmbNOEcYHz8Y4G9Zj?= =?iso-8859-1?Q?vNpGXwGKRKslaDNoPTCss3QraiIxiCT6GAK4FLbK9JHwM6/lpxlvXDkNUe?= =?iso-8859-1?Q?Vvu5YBM/4nGCcL06+cpzlLGfSVCTprlUT4Yzj0dPlC0lTpQpXpRw93P1ZY?= =?iso-8859-1?Q?7PkLJUEApb79VWj1VrNLqHJaifK4t0BpBCjb4nMArLHyE92I5K7vLNesYX?= =?iso-8859-1?Q?CnakJ/1fX+uaBm9YG/zPn5YrhVBsluCW0Il4D7hUHEdTVSmUdVTSC6oUQr?= =?iso-8859-1?Q?ektplekPzOz+lC6YdSS7cuVdjvvJ+Sn7NI3tQz6EIYMy/cMQdlLR0eSv40?= =?iso-8859-1?Q?2p0QEvNkrDCZbamzA3DOkG+3+x9n5G40qxOhsZzG0J+BeL5XCJz8FI3ieW?= =?iso-8859-1?Q?Tnx0li6SpaYm8mfrWojjTu3LYriCl+7e1858Y27EzuxaZ6Pzl9cb/4G6go?= =?iso-8859-1?Q?1/UrkAwAgaftIjOZDcvsE6VDAtwjE1WCDIV5IB1tTtMJ1Ig6P7601lIAPp?= =?iso-8859-1?Q?awXEUj7UkwJGC7RHqy4u11evPOUvC4jhZbvn2/ShH6e+2kYmG4FkW4FbHk?= =?iso-8859-1?Q?/zQqXNu5ZNa7fRcZcFGVnphP2zx8T6VZcQgTsVFOuN4gRHaaM2TAlwUp53?= =?iso-8859-1?Q?+ULZwqkqdG3ytCImwJ2CTUg0SmjF0A3nGM2pTt6Tl9QPL6i8CWIi+yNEN6?= =?iso-8859-1?Q?6cm7m8+A0gqpb3zhidJjJ7KiubZWuU2cEUA/reIo/lXY9jfKAiFWGNMjSZ?= =?iso-8859-1?Q?Hm6JAMuhA410ecb9NZA5Xoq7kKaGbVfT9xxD1vzeKQ/yNGUbmpE4dsaS6U?= =?iso-8859-1?Q?xjoSWs31Dk8hUq2vNNJHExiqLZVEq97KBPf0sxN+qet+yJHU+s814h3hUo?= =?iso-8859-1?Q?QnLQTRFvxf5BhGiD2MSRmUCVceZw8A/bNHbDkqRbknSpCLsXpCxd7fSQH0?= =?iso-8859-1?Q?2ANkxwfCyoT3kJBnSu0XeQbdGHYRXwKNZbaAFoh1ijFdcKghwAwLGRdheQ?= =?iso-8859-1?Q?qQK4op6RkD371KwuwmeIAknsJ9lTefwnuwbLPmOpRYIo9FMf7TkLQwNHIv?= =?iso-8859-1?Q?WOmvlBg1E0c8RAkDOIihVh6zaZ9VkntxgbTAEr80neponHlniBIfLd0VHz?= =?iso-8859-1?Q?gDStnzWI/n+B0SzlvC12ju1i2a0iZ0k73hKFYtbxJZDl7e5ldRds6BXhl7?= =?iso-8859-1?Q?5zDjAxTQqyi+AFLGLwnv2bUn1gbTKk4dMYQ5iyD51VYlz4aG4qOTrkpDaR?= =?iso-8859-1?Q?uUmWqDDPBki3uFPv80f0jR29scf1Gny70aviN4fKvIymUZRcco8nNXDoie?= =?iso-8859-1?Q?f0u8P6mUxruMh8kmflRtvqoGnkQRJs9/HbNhV8AlfVGCMrLSbxOOHYGM4h?= =?iso-8859-1?Q?W858IxvvESzjIeIqtIXINVyu8uncb6yxHzObLPcpRxNPsVnJA5MXAmKhDN?= =?iso-8859-1?Q?Av47zovSrg6u+zZUi8rmuXvbKZnqIDiYft3CF1mnYCa3T9Le36uie7od5s?= =?iso-8859-1?Q?WnXnXRl9IMvIdvNmAQZ3XykSccfPqzqp6Cut+zv0bgYvwe5BqJl0rAAE/b?= =?iso-8859-1?Q?b3oQSIPauNgVy1rT0zVM4HGeQPX82WILaUT9TTQWqeKdf2VK4+o4Y0Kmxw?= =?iso-8859-1?Q?g8qhWrh2KA=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: PFgZtEk0u1QzJEkjw8X2TLPwCYG5r2RRuEaOtjlb/cMQzh4DO3bhvybuhbZ17bItfZkuWFyRyrnGi5rwDX76xLciFMWacGcP9bbVF9+HHUUg4g+tLB5wh7VkyiDMT5JoZ8HKY62mCSQ8YVAAYn7/oMDMuoeGqy06aifnRlPJd/wQcnF0lBgQqWTzl1gPmUbWurtKceU/1crNmPr/nZE+reG/tpALdu1n7LcM4PCjXSiL0KkTmv6qW+FGwP/kErvY8h/c4phWpBrZOI/P79uekrKt5FjWBZSSKloAjYAEOlZQ4EQrtqX+WotzLKnwZAwIA+SymiNOwCP7J0pfwuJ3AA== 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: 545696db-5d85-4a86-ac85-08df188827ad X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:01:56.9940 (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: 7Vu7fQCX9UIRDim/qa86xwZds1Xqp6I63XFrnL8/l4qlnPTh3hvdL/OMdvuQ72REG/BQNlgh90290SVgwU/mWpf6MTG/pqd1aAQWw8AruyA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5090 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: 1790067797129158500 Content-Type: text/plain; charset="utf-8" usb_claim_port() inserts a usb-hub when a device is plugged in and only one port is still free, so that more devices can follow. That is what a host controller with root ports wants. It is wrong for a transport that carries exactly one device. The hub takes the last port, and the device that was being plugged in ends up behind the hub instead of on the port the controller watches. Add no_auto_hub for such a bus. It keeps the ports it registered, and -device fails with "no free ports" once they are used up. Signed-off-by: Jamin Lin --- include/hw/usb/usb.h | 1 + hw/usb/bus.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/hw/usb/usb.h b/include/hw/usb/usb.h index cbd4711933..ab96812adb 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 no_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..8a24b1837a 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -413,7 +413,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->no_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.53.0 From nobody Sat Sep 26 20:00:47 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=1790067927; cv=pass; d=zohomail.com; s=zohoarc; b=IkpFb/ObvtGac5dXovv9Ez/dmsMXdth1y3He+DsxoCywQCI04ITk3CoRSW8VKDcRU8YUlPzFGTDXPrNZ2X1yjLWKUQk8hA0vOugLxj5HnwzcKGy7AuovtT7O8hthfMjSjKB8h9MzZTLzCoMUikb2LiDZn9iAToM+3qNkvmp+2g8= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067927; 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=fVS4QuGgy7PA8PCPabNqcnmC9cfPR2yypY1pSHo2NMA=; b=OZf7gVLbREgwIFhkg6jTDKrfOliUEhdY4kEZqR5+GarBn3tQF2Sey4iFc+bysm5Q6/xsCdpqCDrX6NQ/WZczOBpRCkItmoRjNyBUkiJTbUlknW3OnqRQs+o+0IvgaJcQw7EtyuIqgxA9MN4ALTuTj1dNTOAfHmRHy7+BJznHv9o= 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 1790067927702943.4286303548506; Tue, 22 Sep 2026 02:05:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOK-0007WL-6c; Tue, 22 Sep 2026 05:02:20 -0400 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 1x8wOH-0007VQ-NZ; Tue, 22 Sep 2026 05:02:17 -0400 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 1x8wOF-0002BR-HF; Tue, 22 Sep 2026 05:02:17 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5090.apcprd06.prod.outlook.com (2603:1096:4:1a9::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.15; Tue, 22 Sep 2026 09:01:59 +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.0428.015; Tue, 22 Sep 2026 09:01:59 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CnbnRmGNcCCRj7ylRWXZNR8lu4tLSZw/LQD1Vc4kwC7QF2RlIkN+PiMQYT9PR7/1yQVuX11XIv2DdPnRBjWa/2UmmMi3XZstIaBcW/8y3gzwQNBVh3MGE2H3c3fswaJhyy7LDX/R0muzVuXu4j7fWjMO8XcenKQXQaxJ9jnv8GpWfXvWR2AR53/3Ai9ScRnxif2g1/gMyoYKtM16zAV3LqCiMFqCs6qZVEbIQLELsWcWggqQDfN0oi8ssvlkMPG84lWpkJnKx6Ue2dD/9FXH2LITRvSpr+Kfv4/SNl0dN/4Gs6tIXJb9IhyLmlwjbpYdhTAMvV2+Dj05n/8+oa0AQg== 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=fVS4QuGgy7PA8PCPabNqcnmC9cfPR2yypY1pSHo2NMA=; b=g4ya4FDoss+drbNOratadReAWrrPd2rfJt0YC3bHVBXepHFvB3VLur5HL6Uim2BNv7qt+1QRIx09KkgN02mm/iZqvOUjpFzfmpsEb1lbHbf0jR5rrKEvTMs26SVcV9HI5vy4esKgsMJ1MzKMPuPIcduxr8mx7nS1qaXCCr6DUCSAIBFC3aIp94UHnonVDvicOwPL9hcwotAKLVpIP4lJ4Jl/sOCNzN8PQ735DSLB2ZqvdH3LQFaQ4kVU5maHVQl6jbb7JSkj1LqVWZmpjkBsQ5xMrUpXAT2QMr5SSVmMlysUKeUDZ1m/Uy8yTsav+L5jVg5akbtdgi3yuXYF6GWPUA== 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=fVS4QuGgy7PA8PCPabNqcnmC9cfPR2yypY1pSHo2NMA=; b=ehpSi+Ji1PjxR/whkvQMLbSTxJQBls3vGR3MJhQA2DNh3ITcggxqKZ9wReHl9iYgPdwkEECTyg1626jkPZ3XTQcOu59XCHAJhRs8+KczUQ3FqFiTgrTqVbDIVP4bGcsces1xtN42Q032Shsk8U0llyCO9MUUFqGQX857RIUqjeSFkGSzlD62DEFrT/jUDMe0dd/qWTR4mwmCdwh+jyx9ftNk2+/4WZVM5TokBVcbMptlaThhitBE5XZ9oR1os7BFtJ5GC7lFcRwVZVWv/hfn4B/WJnOgKa2GBQYCIdhQ0wppa0Q+Hk2CDkcHrzhUu+aKDrlnyOq2aBzM3Hdl9iOZjw== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 02/19] hw/usb/redirect-server: Add a usbredir server device Thread-Topic: [PATCH v1 02/19] hw/usb/redirect-server: Add a usbredir server device Thread-Index: AQHdSnEFna6GqnvWPU+v45ByS774Dg== Date: Tue, 22 Sep 2026 09:01:58 +0000 Message-ID: <20260922090154.1792077-3-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|SI2PR06MB5090:EE_ x-ms-office365-filtering-correlation-id: 0b5d63dd-ad5c-4bfd-2da8-08df18882943 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|23010399003|1800799024|376014|366016|38070700021|5023799004|3023799007|56012099006|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: AT7neoE/rsOVn0PwnPvroPyq8Eias+Sh9/AI6sHdgkIBt+FilHuuKm1BWW7WkpnC2gUXyPWxXsimLOy42N67DLM3H9qRGCTbjrrnSWaJM4AmIk8XPlmFP9QsQESgIAKosVAowOwrRBZLXtBywq+sy5PLMhrqYQjPwqJbXOteFUXe5knXisRq46WSCjffcJja1ryX/sC58Ec88rfwn2qR9PoY6BVNlWdJqnGIXJGsmwToD4t4VmhOB9+AcZAB9TjZPSH/utksGpcbALz4xj1dULysTcWj2el8aR2uQ287zfiqm5cQZzpGurqViabJa2ro7d2gZdz3J99t9/RtdSU3wo4FYGaRZs72aAUpa721mCiGg/vMAUHzrBBbN2TrDQxVd7jYC6p2OvtDuevYUB/LKumYSaghk/xYzNHojjCoV+xQyYu4OvYWZqdwDHQtiQ8CmGLyxZK2CZNfg54qQRWDZfhlEM4wxk6DwItQ1ADhlnnx+jw56ANXKydyv6gphoH20VJeydocz5a1quJFU10OWcxaFcvvflVl+49aA8qEmHe4Xri3939DpT7m06sOpkacnRqfZk6jKMt9F/KKnstBVsGM587pHPU1+SgiYQ9VOKABTnIin1dnmTKRglJKz/CXeftDd/mKykvHBqnwmJ9vVjTjEC+muOpA29OGueFv7in4J8NpTzZKZ/mwfMfWdkXv3Ok9MpQjC1bSxirpCH68kY6Iif3J0g9I9SAhr67L2ZY= 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)(376014)(366016)(38070700021)(5023799004)(3023799007)(56012099006)(10067099003)(18002099003)(22082099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?5lCv4FTyE0EJkjOxz6QmwcKgJJYqr+fa9xqFnTgoKYiTy5bYHMYlh9dbI9?= =?iso-8859-1?Q?ovFkyZTqc5Dd62Pv+cC7D8TQ+GKmIgMrVJ5mFuHQk/lpad2YBTuiMGgpbP?= =?iso-8859-1?Q?rSup0/wNEh6cPtBHKcEub1YqBfEd8ylxGM+xwNu1+nrzPPSj3bxyt6qB5g?= =?iso-8859-1?Q?Makxy9mgrnRR5bmp/uJa9xsWzY/y/5p0i5doo3OA0byHAEo7vbrOjmS/OT?= =?iso-8859-1?Q?deLuJGlfg27sPxdmd8NAakurbmzwGfMeknpGUvguoyV5kGBb1SRYFOgao5?= =?iso-8859-1?Q?+qQVRoqxeMB0kfPohcdoyKaLa+eclLdbWvLyrJEqVNzKipFFTEjwbo1Ecg?= =?iso-8859-1?Q?4ePhqT0b8PMjyU3OcAgf/1IBalMAvDhe4Vn2qyymSYXCJO4LhVtrMwr80H?= =?iso-8859-1?Q?1h9JBEbIMp3clt1ucY3ArpjT6SLNloAagDMotWYMqMJxPKb3N8ErWZNzPh?= =?iso-8859-1?Q?Qecp/6AodLWr2WeQ+isAgO7uKYROG90q5+f3OcJGCuaQnQAwsEewxIvUnc?= =?iso-8859-1?Q?rQdlxliLspON8/B8tAupnxjGbjkOW8dvHm6w6t5ythx4CmTb63UfW5RV8k?= =?iso-8859-1?Q?7p+nSWYYdHswss39p+j08pTfQdE33ihTlQqYqwslGbaV8zjzN3PP2hehGG?= =?iso-8859-1?Q?f4BWb9/OS3MR6kWliBiQw9hjGpMAOhX3zE4Y1R/OIhcU0ZQU2INJtji/WM?= =?iso-8859-1?Q?xG8GfyhT5gsxhSD15331Khc45MMvDcvpb8nM8xhCqFtxI3Ua2HY8sfy297?= =?iso-8859-1?Q?i66U4PNfmBd5ig3EzS7+4lW59DJlzeM30AgUGti5FZ6CKhji4+J0gXQ3kx?= =?iso-8859-1?Q?BsPhxSCLbbg3gNO+oXtpB3vLjyVB9rMpSS6E5reKe2KV7PrOp1tOvmwIZ9?= =?iso-8859-1?Q?JLphHWnwDOnKglo4OM7ob5tCpOnTmYTasU9ABiWAXYNQz79HfuZ0ZRo9Nd?= =?iso-8859-1?Q?3Uur3sTg7ECIHRRXti3z2sM1Tg3ah/2SNRwO/GdMYGVHSZvxalfcWHXKw1?= =?iso-8859-1?Q?f8JHMM1FvnwpXCjqeT5MYCNaH6C2rPcMikrg6jvKHMjBZ/uO6xNWpRuDwI?= =?iso-8859-1?Q?DU+l2yMdNG4LK75l7C1BLZuSpbBrgBFG6WWFq2QdLJTAi2/7ijU8Cen7jC?= =?iso-8859-1?Q?ArqoFMzvFaZrOQilNgD2HIZ62fnn3k3fdhiSWSGuA2pbyAIIBAoznhoIMS?= =?iso-8859-1?Q?nyLLsGLxRMN11HUdEigSEMsT6NvrBK1atM6zM1s1qo6jX2UPH211rXXrY1?= =?iso-8859-1?Q?FYrEzMd81pZf7flkK7rHfsXIcZQ6S0AKbnXNySG9mWAEEhUQHTeDKh1AyL?= =?iso-8859-1?Q?RoAHpMEBfjsqyb7K7kwRn0Lm2xG2Ctw6VRSj+80k+LqDCdvaE6W1ZS51EB?= =?iso-8859-1?Q?USBn5cd7OOi5nbC81zwCfcfctboz0YHfYt+gaePGyOTlcW6DYCRotdUQkW?= =?iso-8859-1?Q?nVT+NKkMam7JSirQZexBDkGn7ghxPooBx1l7oW2veLLyTpaFT3ssPZl5uI?= =?iso-8859-1?Q?DmVg8JWgmBxVjy9QoBPAjFjRPPflF7CIP4yktvUp0hxRSeUGQ2AwJr4M9e?= =?iso-8859-1?Q?UocFNOXCyZLbbXnN1KROiR3qrJg2ZDl+SE5C+nHeLReST30woocHL8PSIc?= =?iso-8859-1?Q?uE0nyQnavi34xWZWeLAI6ojM2rYIBbpP6PZabp6MahWOKw8o9NRzHhQatE?= =?iso-8859-1?Q?yVBkYtNf9lfD6mMqNWsQCaw7hlD0GGpOKdy4ZUfWGxUDt4XxUUKQdWTwRf?= =?iso-8859-1?Q?PDcEu7O6ju55cCZ1pLsgyhp1hcGDEBz/OT0NpC8FJM4FoP7+fAA/GyPC1R?= =?iso-8859-1?Q?72Q7GJuGYw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: yCHMy103+aEgIe15XW51oUoapIgRcAYhQ7XR3GmV5Ey/G0DRDlsMafIEaQ9Yy7Tv48/2N+c2GHc0bCxt5NBAuDs0LpWjcv6DmLGNIA8JiTDSIajsXMxMzmsiXOPpIW16Cdyb4SiDg4r9jhO1SOQTqATJlcroLwa9uTEJHbxknDvcXHglQim4RZEHEOLjljhOR9NSwHtxFycD2e7ll1w3l1JOZVeMdWzC31uwTQ9Iv9nfY9q8DZRBrzCeX/yACKOvQLSHcNJjf20dCrt8J7odD+fjz4+zpZEn2TzpzOSeNV5/jsrojZTyGFuABypgWeRImNqO0jE6nvQvNh5O+Hq5GQ== 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: 0b5d63dd-ad5c-4bfd-2da8-08df18882943 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:01:58.2092 (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: WBqWDAT9to8UeB2rDBFrACT/Ncimg5gupUM9IbMTdPXy3vTqc9illYLDGulyX70jBVoShimpPBpg3MFluNHkEg5VV6xkrtAsNdJLE/BbAdA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5090 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: 1790067930043158500 Content-Type: text/plain; charset="utf-8" Add "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 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 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 --- include/hw/usb/redirect-server.h | 27 +++++++ hw/usb/redirect-server.c | 130 +++++++++++++++++++++++++++++++ hw/usb/meson.build | 3 +- 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 include/hw/usb/redirect-server.h create mode 100644 hw/usb/redirect-server.c diff --git a/include/hw/usb/redirect-server.h b/include/hw/usb/redirect-ser= ver.h new file mode 100644 index 0000000000..e81d4e0608 --- /dev/null +++ b/include/hw/usb/redirect-server.h @@ -0,0 +1,27 @@ +/* + * USB redirector, server side + * + * Copyright (c) 2026 ASPEED Technology Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_USB_REDIRECT_SERVER_H +#define HW_USB_REDIRECT_SERVER_H + +#include "hw/core/sysbus.h" +#include "hw/usb/usb.h" +#include "qom/object.h" + +#define TYPE_USB_REDIR_SERVER "usb-redir-server" +OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SERVER) + +struct USBRedirServer { + SysBusDevice parent_obj; + + /* USB bus */ + USBBus bus; + USBPort port; +}; + +#endif /* HW_USB_REDIRECT_SERVER_H */ diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c new file mode 100644 index 0000000000..5f365f0a35 --- /dev/null +++ b/hw/usb/redirect-server.c @@ -0,0 +1,130 @@ +/* + * 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 | + * 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 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/usb/redirect-server.h" + +/* + * 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.no_auto_hub =3D true; + 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 d4ba60a91c..8e95cc7b74 100644 --- a/hw/usb/meson.build +++ b/hw/usb/meson.build @@ -77,7 +77,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.53.0 From nobody Sat Sep 26 20:00:47 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=1790067845; cv=pass; d=zohomail.com; s=zohoarc; b=LCgJLCDtjARfv1v8HTuEPlxQq4ySSo0sl59iu76OAIAghKzmhSi45myZdkAUBCXrpv7qK2PPHkT3qlkWDeZPT/2V/nfkEF7EuoW4zTzCUuZVJzgjnPe8QdoR8KEpnRwSuBasvoS9oJE6AoG+7YRMawAuzREA/w1xv3PNObu4ArA= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067845; 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=bumKTamqq6Kt+f+Ohc1kdZVuLAkNZHeLFKqK5Br0uw8=; b=a27vqR05KU8TPG9hDcyvMzTOaaQCEhtor243CTPXqYou1GnAtWcnyZkpfqtwRyGOdCBpNyJAjgI8dEv2dAdW04UhX+xKCOtCRTIAs0hmsW7COWQp9JnsCyg5KTBEjupuqG+JcHVx9tXeRCSP5rh8IOxZPNGWDPWaiP9BX6hWElU= 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 1790067845834433.7715677934186; Tue, 22 Sep 2026 02:04:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOJ-0007W4-BW; Tue, 22 Sep 2026 05:02:19 -0400 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 1x8wOG-0007Up-S3; Tue, 22 Sep 2026 05:02:16 -0400 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 1x8wOE-0002Bc-Lj; Tue, 22 Sep 2026 05:02:16 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5090.apcprd06.prod.outlook.com (2603:1096:4:1a9::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.15; Tue, 22 Sep 2026 09:02:00 +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.0428.015; Tue, 22 Sep 2026 09:02:00 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RVH2vHtAChPP0i9wIV71PRm/4T0EkUHdfZlm90rNZ4z/FzXj5yQIaN1c6k6VJ04awP9qJywkklZEJ3XGN5rg+ZotWbiyFUPOepUdzUId04p5kjJa1Q8gyESR19JomE7BpkoO9mE02G+9C2oSPgEY89/6mKRrgHzrdrubJDWUC34GxnJ+3vI8GAGSYYOOy/Jig6DGYRd1CBjV7ciT9/LJjBRNvlkpiCkpAf/UZvS+AwoBKbeBJu4+3PFRKIyReNLc7SClgtO7G+Ghqq1Olvk2AlMjRiDESXV6Nn/tuAQ4+GGtLr25S83ED63dV3my81fhX1jdzpbESSnVXsZcJnThcw== 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=bumKTamqq6Kt+f+Ohc1kdZVuLAkNZHeLFKqK5Br0uw8=; b=vTXsrBMxN0OgarKDvTVr1cVQ49ui3RKZSBJt/tTcZzlPVGxkGY3rQppC+yOQ1UC1RAMb/47BJcvRBIlWktjLjek7LkgKNuwicKEEZPGqjrqY+t1sIxh8MSRXB1zGHSTZL20EDXDh8TFidRYnjuAWACdRHVmL3SjAPqkUUyGTtt8EsEw0Gs1gyRJ/uoTNvN5+PRZskDLMk2FoqUjno9Fg8c7zQpcrnjdl2Qodv6dMQVa4tyEVbViDI4p3bdEUEqXXA6JGrynJJtmzEml7roufF+TmEVkYdY9lKqCzLv70SEOlztVgz/ZFynoAGtcNj7YlYyQvKFzABmsh21wXjz8/yA== 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=bumKTamqq6Kt+f+Ohc1kdZVuLAkNZHeLFKqK5Br0uw8=; b=H3jrd9lcNy0wx6+Xx7sk22Q/GGnIIfXa2Gn1mwH2RihEzFWl7tZ+ztXzJ4pGwA+o/BNOKVdvgkG8YCv9j59kWh0uTT189x52OjpKEhG/vcGXlYPE8NxoebRiEfYDVaOgsQ2k2aFFHLBUYDmtM1t0U55nBW+G+T6UQ4C5TIJ2PLurShP5HYgqrN5NdHhYIPdPslO/CV1XGP2NG18sB3sTLY1x4MDdpMu/JeBO91HIoIFTbQQHwybRxqA4Cfl771r3dUSzr7ONvQXMvF5dXhaajztVL9t0rzb3S4bZXmC+JZd/eK8y3YAKefkkAAUt6q44TFF8Em0JzKrdEobX+McE+g== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 03/19] hw/usb/redirect-server: Connect usbredirparser to a chardev Thread-Topic: [PATCH v1 03/19] hw/usb/redirect-server: Connect usbredirparser to a chardev Thread-Index: AQHdSnEGYE21x5YoNEaUStp3xO2eqw== Date: Tue, 22 Sep 2026 09:01:59 +0000 Message-ID: <20260922090154.1792077-4-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|SI2PR06MB5090:EE_ x-ms-office365-filtering-correlation-id: fe6320ff-785e-421b-f9ee-08df188829b5 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|23010399003|1800799024|376014|366016|38070700021|5023799004|6133799003|3023799007|56012099006|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: 6E6I5gXx9LHHgBtku1MEf67QoUj8zJY1zrTCi9S2eZUt/8oHHSOKCG1TFinDInvbst367I2Cv+XOAIAinTk7GoZgHMRk9W70G7F0ArabgppFHOY0jB0SMZGMbsedU9EERxLwO9EF6aHDJCf5rtdVB8/HomQbhhcHaUG4LxkefNE34DKWPd7i5VOdznbvI4Ddqkj3+nlx2Atf6m5NjxsGz0b3vOMSO1KcBNLZdn3NGMt+qfgDRttWE1rwbCga4pWXd9ieHUu+w5lwGHYOQAC4IT6Xeu2u5F9sQ8fZIsndPRV18C3Cv8lOHxLLpt1Fn9eljPd+rEC+GTLMgD3A/VE4VxtIixQnlWwlSBMN3SJyQl7JkndG5FPOYA4HhjS6aCQtXqkAbwyeDI6+ZsSU+ToWPHzWEJsjEwnUOFhxQrNvBO8/DDUIe3gYXn9vAKIGcGdxPrBNJsqtTK0sAOtK7IQTS63rT3LyPRSxB+QZidDkP1PIBZCbARrhzYP8ud2vLOURU7HObI80RimJWiC1GUSdRsMlkDygQjbder9MJPowyvZz4WtG942iqtBS2rGtqc39dUiiKsadtW4JBIVwLcK7yk76bN7YbeSBb3VhQ22W7UIKhcckD3lh2gdh96n50+4B18IpZgbvfLSQU46JkjPrm1HLqhslqmQ0rr8AWmtwXWPDsKY6+QrlmmwFjZp7b10G+TO1eTGPQM9xJU+vlOqRn7Qt/z/S6ZixoF5IBMFpmgY= 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)(376014)(366016)(38070700021)(5023799004)(6133799003)(3023799007)(56012099006)(10067099003)(18002099003)(22082099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?6E2bC+y34Qtpp1IcNU+QOhsns3xow44D+vxLiJjUKnxQhKmYVhdJxOTEcD?= =?iso-8859-1?Q?2LXAMyNvpZsZY5A3mHvXrISNe/JZRHY8e8Ibst7N0p0X2iLQqdqbFnworh?= =?iso-8859-1?Q?4lQk4ZLMPLHAOLv2RvG1sZyA5zPEh4tjiRjx6ZcVcYQrrm9jomOObnXCZV?= =?iso-8859-1?Q?uHOOTKSSFtVhHUvFdeIAy0dOW6dO309eHXcG5X3SCCOmxoA00EYMKYW/Ys?= =?iso-8859-1?Q?ZBmhHwDMzPbsBDQrNC+e4Pn1tdNv5VT5hpbwPFB+ZXsQ+RW+h4Bor2L6tS?= =?iso-8859-1?Q?L+mKf8mlfFo7FNrCpD7I7UcITT9GLwxJEvVP6A5puLddVkkBAEugSHn5Yn?= =?iso-8859-1?Q?uj+weJysc13/Wib7zrIUKkG9uSBaAe4sbbwlWDwoO04ME9cxOVAAMupxXB?= =?iso-8859-1?Q?t2/wLBFsU58va9kRbLgHHqYRO/9iet1iMkqlI/pC60miwsnZsLQmXq46CG?= =?iso-8859-1?Q?K6OqvpILFzDwfJS2MmfUok4Dk0YDkG+Mhd35pxDxMXjXn0mjdgpDFRtKpw?= =?iso-8859-1?Q?a7SVBpWXt7f4tKSe6BOEHotJypZGk3A+uzKGbpb8wm38yvN5QYWmkj/CX1?= =?iso-8859-1?Q?NuNRDRgCyJGPY+qVBJN2GggOkejFmqyqD6mCQ2vMFemKBUC7mNDmYl3i2I?= =?iso-8859-1?Q?uejx65WRGiMGcfL4fAayqHwO2ljL6dROJVok5EGUG3SAYpFO7nfqxTfM/P?= =?iso-8859-1?Q?7C+O2wKY8a7HnAgPSivbbMRnZKPFjpavgE3BZnKPaSkOQxze/oK2HsMyl/?= =?iso-8859-1?Q?YXtXRlCK9No1vN+gTNOG7YDR9uVMa9PZTZVrt6ZTgBLvaQgY7kBdw/MLje?= =?iso-8859-1?Q?/Zvpb1OTv5dxMObWZDDslR8UBg+kO56QCI9pztUsNvK/vsCeGfpUvk0Gmm?= =?iso-8859-1?Q?vOtH5sM6fSXry5r1DKZctz7cJtdFrWpDV0ELpCUbbCAKuXYwfEuFgU8IZQ?= =?iso-8859-1?Q?yEnobvysKJK9QgQsFzFd7ePdM0xAycgRmN9OmCvEhc+tsPSXlqh4WI1ATJ?= =?iso-8859-1?Q?wsY+3yOQCFxVFiHq85Pj+Wl2D8py+n+TjgCOK9A4K3ijOb08lShxPQsA+1?= =?iso-8859-1?Q?GRm4k3OUh+8aZdJX5Hz4UkdXDsMKjmFZbVXuhZY/NILWZETaHnTDqzsvGJ?= =?iso-8859-1?Q?ccv60lWdST9LtdWYGAT32pkFzi6zlzPl4skRnXHJL1lclYqqbg46EPmpAp?= =?iso-8859-1?Q?91E4D9RIWsa8LcaoVRtTQMFbBsyfAiuqrtW9MFT/cOrHvlGVRfOw19BqCD?= =?iso-8859-1?Q?FRMuSuYkuwGbt8ptad3RtPefbfvW/BwVYSAuzs5fnFcaKWm0AhJCPsytfI?= =?iso-8859-1?Q?I3Z8OQrSCvC3zRwuHFWL4c7R/8tAesqs94t9T8R7bVd2bgtyUy1VEdlHdJ?= =?iso-8859-1?Q?ZOyy8QS0LmDNpAcIv8SBOFqOz6C44rXNj+AddJyzbu5+x316jYCCFwP5OI?= =?iso-8859-1?Q?HxYoQWMyJQrGuFKxlX4w+nz9Mlu+o4nSVAh2xGouxsos+UUUuE7Y/lzjei?= =?iso-8859-1?Q?ofzCcQyB76+FRfAqQcqlsNPt2LVgYzF5TSt+kB3JXZaM5Ze9Sx2YakaAgW?= =?iso-8859-1?Q?ld+lS1qQbWXn9A8xaf4S26VFRzIDe2b0qZC0cfBKt+4yXzf8lUR2vLKoGW?= =?iso-8859-1?Q?Q4w5ldzaoBcbv34ZHCIlBqsAgK66NNsh8UfrxS6m/QHIPT8sMvchmD03o8?= =?iso-8859-1?Q?PCYyvitzWUq3W/otHfTTFkzAY5+jSY7rqaZSN84dngB8aXakE0sCovKY5b?= =?iso-8859-1?Q?b/sq+zaBkg2oxgNpHxPGWEHxacd7ASpRBLlIvE4D1HVTN+z4doLfj6VitQ?= =?iso-8859-1?Q?HbYHuvOVcw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: YAKfeM7w/5Mn2MuZBEK+p0BBK2YF775HBHt+61bOXuC97WxLKTcK9wEPR5u63uWKRnnoKqlQqlaTt58ZdWI8a+kZ3DrleR3/NcJ51pZiFN2IK/1wu9KAPnGt+Hv8RO/fpeEfHJtnUG6Y4XQvR/OedOV7OobCGP6Xar/53k6a9/2BmeXEoHm6WOhGx68c+g6P3GAba5ODEi2lzORlIDkuBYX6np8OnpcjDgOW9ypw+2ciGnBbtEFNtU9XFA6oRXMUsMaDw3CNn6wFrbBG72br7uI/DXcc9No/91Ncf1obROCYe/0dBdu0jzIpgvXGe41FSOJnekM/9mYnCuDy9Nk3Qw== 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: fe6320ff-785e-421b-f9ee-08df188829b5 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:01:59.4430 (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: 06cZZ9cj1VN0q8Jlp3iP5SIK/CLWHnEj85HOYHnW8Xu7dv/PLSMMy74WKf2lay8f3qqFaACXdqrzCwl0XbWm848ESKLYzCWFKGKLa8Brfyk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5090 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: 1790067847592158500 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 --- include/hw/usb/redirect-server.h | 15 ++ hw/usb/redirect-server.c | 268 +++++++++++++++++++++++++++++++ hw/usb/trace-events | 6 + 3 files changed, 289 insertions(+) diff --git a/include/hw/usb/redirect-server.h b/include/hw/usb/redirect-ser= ver.h index e81d4e0608..2af881bda9 100644 --- a/include/hw/usb/redirect-server.h +++ b/include/hw/usb/redirect-server.h @@ -11,8 +11,11 @@ =20 #include "hw/core/sysbus.h" #include "hw/usb/usb.h" +#include "chardev/char-fe.h" #include "qom/object.h" =20 +#include + #define TYPE_USB_REDIR_SERVER "usb-redir-server" OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SERVER) =20 @@ -22,6 +25,18 @@ struct USBRedirServer { /* 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 #endif /* HW_USB_REDIRECT_SERVER_H */ diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index 5f365f0a35..c36b5c16c4 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -50,10 +50,18 @@ */ =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/usb/redirect-server.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/qdev-properties-system.h" +#include "trace.h" + +#define USBREDIR_SERVER_VERSION "qemu " TYPE_USB_REDIR_SERVER " " QEMU_VER= SION =20 /* * USB port ops @@ -81,6 +89,232 @@ 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: + break; + } +} + /* * Device registration */ @@ -89,14 +323,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.no_auto_hub =3D true; 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); } =20 +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; + } +} + +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. @@ -112,8 +378,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.53.0 From nobody Sat Sep 26 20:00:47 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=1790067808; cv=pass; d=zohomail.com; s=zohoarc; b=g5QCa4byx4q08o3JUWYV6zGRMDcSbm9vYMQSb7dWuCtd17Xei1KAIInODwIYnKrL03rJ5UEh+UpISaNA/PXkQKwu/J6xhMi4yjq1kqZ0BstJi/SsWUfaBrjzL7pV5eVrq/bMs0nf98Z09x4qb81WiCL2y72HHn3aim0KCN+nvF4= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067808; 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=WsajMUETsE3Ty9K3/qnG5jZcPTKzpskahWJBp50byN8=; b=NqWPmUmIQ7lgHa4yjIGc8Tjgu0xJnInMJOoB/MvUpV9UgnR/YL03ntvDwHkcGPdu3HjeFuhVBm2aZadO9K8yDvq6VpTy2urgljMYEX9NK6ael1usPN8jsdb3BxCDO7Fn7jR3RBy9QzniQ0AquFQQVNgi+nzWA/DBN8QgRo8E/VE= 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 1790067808012418.863700604756; Tue, 22 Sep 2026 02:03:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOO-0007aA-VL; Tue, 22 Sep 2026 05:02:25 -0400 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 1x8wOK-0007Wm-D0; Tue, 22 Sep 2026 05:02:20 -0400 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 1x8wOI-0002Bc-6j; Tue, 22 Sep 2026 05:02:20 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5090.apcprd06.prod.outlook.com (2603:1096:4:1a9::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.15; Tue, 22 Sep 2026 09:02:01 +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.0428.015; Tue, 22 Sep 2026 09:02:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kXke7QcWE7R0kpGfuI0vXyz7wFGLTn+uZiO5L10X3ju0DRU/KzuCFAsVQnNZQwpSCVY126z1zBMFSvC5SDfAO0WdB8f0XHILql60r8WGooYNCU5rYCr7nFzDH6eI8IaBQnejjbFfmEY8Veqcyv41huWzN8oHgSINx/qGQlAjSZ4I/tSZFxBBBHnveMYJL9K9RVbywk7M8W5dErCyfNHD5O2dhDBoqXVbqIJa36D/XhdQRpxfiJVZjO/pOf5Tlsi/NAlADwpAiXxQvYK1912OotKrXDte+JJ/mDN7H3lpj5845kMlzmxp8DN3wfSy3jJ8IyRR9ZOLvkUzZlhDAfJvuw== 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=WsajMUETsE3Ty9K3/qnG5jZcPTKzpskahWJBp50byN8=; b=XvJKdi4ACCbP0o+Wpx2Gj1SqiBGDEI7ped3RHkLr0zxLakj7HW6nwnZSQivRPTDDwDSpFBexM93jvTnNn6broCIrN4TfnL0VZcZTd/DqMXlD36zR+0WsWo8//NFOdQ61eYo/V5Mh+QMxArAWFLkBCalwwCxd61T+YhZzDUEWGhZJ4Rh9YBn51Kvd5rDiSPf+MWUhvlpjL366OUOAhecIOqv+RWW8a1NzJd5HR7Bhn/dIiaNzhVn+M4z0znZpxsiIcMNbwUeUl1S9GoIdrZAwRGbSIfswy7dY94UAXLiydPjUaubSGLoIkI5WW0oawykdkQJuUdoxaTgvAUApPsUWQQ== 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=WsajMUETsE3Ty9K3/qnG5jZcPTKzpskahWJBp50byN8=; b=WCMjAubvDB86ixyQX4xQs2QPkS9Ciz/EwLnMCaa/k8C2iPdM5V/SRHBzm8LROCGxLkSXGRFULL6T/2bQMzT8/AKTU94eC0gd74vIBdvdnAW1OStbyfBtQur/z/BQkNEniAI/G5CV95zntcLTQlFQDPQoEmEHwY+waq85LoejwnM8T6ftExxLGuX0K6j+VWq0E1qBwRDNwv8ZMe5FXUAYmw7zPP0x2ylgJCGzF+Ww4ZG3b5eWQbvABoHPQyJh5S4qJvfbL304pSFRUlXzxNb0IBZ1ThUuNdkh2DEpHWsnfCD/4CE2u+ijvdn7k3LaVPLCLAAY14wQrPPmKj6rZOKxnw== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 04/19] hw/usb/redirect-server: Announce the exported device Thread-Topic: [PATCH v1 04/19] hw/usb/redirect-server: Announce the exported device Thread-Index: AQHdSnEHJTbLGrJuPEOvL7OV8PWYlQ== Date: Tue, 22 Sep 2026 09:02:00 +0000 Message-ID: <20260922090154.1792077-5-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|SI2PR06MB5090:EE_ x-ms-office365-filtering-correlation-id: ce60c032-d0e6-4ac6-47bb-08df18882a0e x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|23010399003|1800799024|376014|366016|38070700021|5023799004|6133799003|3023799007|56012099006|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: BDflsnK+ULl/XdavDCEIO6RRx5YieunW88pbAmtWF8hpUvKWJeSyZ4JdSSmIqt6HcNZkXS8KgA9NbLb40Vly/jH5xkYOsVt6sb8x8oXxP4vifC5oRf4Lpxc0vqQ81INX7f17QYQ6L89V4hIDbuFkUjQME13eRQFihOEJgim0M0G0V7DnqulXAewx6Mjyw4q1+TQwVohB21r9nVeq36ZQnhR8jWDt2tV9E3a6hGHRC8bnUvXPqV9qnWRJLpZeVdhn/SJGt7konUB5S94Cx3d84m1EZG6WgheB1MPD0bwFsfgqOJe15ZW/hfjTSEogcuicIrb6wLA10EQx47NriR8GV468YlO/catP9lloWZKFUtbdAZuJ1pxwR7zW3V6FGhywmwQA+KslsZxbwNqAXvXnhHaaOgKccMjQvZfVoYEG9E0tGMcY0Ml2tJtkCk5FFxygkDV+R2rPEzN/1x33Qb5zHBCVMZm0qyx9vDTPXu31tIhASiD5dWIXIkNQitYr1rVFQ5r6L9JV3mbA5UxlpWYJEwDVaVi7HAfQBc2+Gdb4F2QnG0c7IdGqAgUaI3PJZVOpPw01IkvQderek/42wMwT9YWRilnrZSqdr/KUfXRZzivdBvSa3CR2NaxZLTr62SF8qOF0NOvoehas7hkJvqUHpkAkoXgPpMv0LEbpiofm9v3DAwrRvShpVOqDv19gWZ3wDg8QASrk9K7Sd0EiI7gBLEkpSHg+0Hd276mqVbXJFj0= 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)(376014)(366016)(38070700021)(5023799004)(6133799003)(3023799007)(56012099006)(10067099003)(18002099003)(22082099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?2w14x/Jm8TYamSbpQCzE6/gzx2JYIMPp39m86N7fPUD4Y1Rf5jhLgMFlpm?= =?iso-8859-1?Q?+IIlfwv5l1q1HGpDSz1tkVq0WkH2omBFpSCtmzC1wbtPIt9PuExhanm3Wu?= =?iso-8859-1?Q?D/PbqgEuJlp7/o1jVQhY0oaAB3pcG0IAP5dpGth1Er4kZ8MDzNZVLo/mKe?= =?iso-8859-1?Q?8BYF1rTqbuhEgxUGMDgTsT4/84ws/VnXv1uaUl/gAUfaUydnU3x+oJ30wv?= =?iso-8859-1?Q?88brB6R4yn0OrSILFMTFN/nl8CVLXtNk1elg9kJ9b2F3Sy0zGDtTLdreUh?= =?iso-8859-1?Q?TL2RMu22cNgP3T25yFsM8Zj5mtB1/tYH8Jp8pULGHdnTbPaRMu4F5EQm6n?= =?iso-8859-1?Q?5At/qGNqPBdNW16hfbjUOp7+aB71X0Gr19qSdsCSrjn+tjVVgJ+OeG849U?= =?iso-8859-1?Q?ysJo+BwoMPQ1I54CiZhYhVIaXz/dS93FBhxoF92YpcDX5o+12jpbU80joC?= =?iso-8859-1?Q?vDCARtTmkTgTdNiizt5E0TMEGh4SmpryaEhszgwZiNcH8AMzXt5DhwR2sR?= =?iso-8859-1?Q?5av+3xKbjg1QGURPhCubrU+E/mjPo2jmJ/Ff/wvr6S35EsZkKSUZAni9Je?= =?iso-8859-1?Q?z8eAZfPCeaJL+ZExQgfzeGa/ObToNmVKGV6ea/43UeU+CS89vFrgufY+6W?= =?iso-8859-1?Q?9CLezSGr4K5dzwLv2tmMs/d5ItAIsPLPOItrKbHXli6tpW6RDP9FsXaWmI?= =?iso-8859-1?Q?73pvgaBMDi6BxYxfCCde9crQ2BqdkkeyUcqcQk4IBSU/VEkuPixb56wc61?= =?iso-8859-1?Q?nSqpWPGazzvkR47rNQUOgoMTfz43N8xB1JNgHzmsfjJkmwODbBfZhtOyr8?= =?iso-8859-1?Q?pIEWNwp8MlwSh4VLPoX9Mxf2wZonKRoQievE3GldvjSTF+23lpar/Gb0ai?= =?iso-8859-1?Q?+JQWgZesB/j9JHcM0XfsRwh+03eiJfUcnLENwJA1l7R6A4Jt3JFXMpJk8S?= =?iso-8859-1?Q?lHFRwlFXMclxFl0rBVAM98Wqwmxxx7qYe0oVFrG4NLSyq6DCE2AWtIJf87?= =?iso-8859-1?Q?nUSAcUX1D70YSZrzdnezhn2YG+iaXEtbldX+YF0+Mhdofm2MhCxPThjEXF?= =?iso-8859-1?Q?ipVvkoetJaoM/Zz0FMz97dq/Ezk71OWzbREYcCZiMKzrdKySJiusyxH9n9?= =?iso-8859-1?Q?n9N6T9RcEBwEnP9QNUdhRTBXGQ2jeDETxjT3nqnS429i1eKMjIP8wLkQJ8?= =?iso-8859-1?Q?9/niqCr5/WkVrvccFUI6XQmLoZWD9t9bygLtkbuLNO9aGODGIVUMyfIzMm?= =?iso-8859-1?Q?W5SjPxJ0nqJpoE0V80jNELsbyXwobL8P8I9JxK5yB4i84Mqe4B6tBpEdKk?= =?iso-8859-1?Q?NWxOKHxw7U+2yjAlI897d5hbe8gsj0SrJYrzGlLYpFWBseYUrYq61GVtaf?= =?iso-8859-1?Q?GT6ORV1Nv5DU42ZaE28EJfA5uAVIJ4pL1xPuai0pRjc+vOew/puWBl8Hg8?= =?iso-8859-1?Q?T0RXsPf7GQsls83kwrUYJvuI8FFD9jkSZlX3PnNvm3WOn/ztoHTUN4Z8ms?= =?iso-8859-1?Q?NkImWGuYyFIufFfMdbX0g8QGY7cyEae6F9JTORsJlIv9/rRery+Tv+g0Fj?= =?iso-8859-1?Q?oBU8BOsPr94sgBf/C8VfOCDlCThxaTN+R/AhhjlDES87lurb5xCs7J7jgg?= =?iso-8859-1?Q?TE/1/A1piifBaw4+I28/xQY6qxs6lqgRFR05nW3uIsgKNKGlojmDTsGogo?= =?iso-8859-1?Q?p0KBSPYss8XDo5nZn2gKTbyjCGH1mZWbBDPV57zk3R7c5nJidDBPKYLlzA?= =?iso-8859-1?Q?RWnokYbJxR6YdPFnqJTJn6VUuCfuFdYQtpvpTDlEtsSpryZXPGs4pmRJ8H?= =?iso-8859-1?Q?JutQ0dT8HA=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: dkAV2BK08TqTR7M/P3CX4Rn5ktxBNhmsbo02Y44V3Eufwfpk7AET3HiG4dF++4TuBzZHds0QUGyU4CO7BeodIVJUZ5RHrRZf1FPGkPSXpRrsPzb4IL+ljs5rQYW6Qm+G9GCYyxOgjWdwtcxl6jWkiA6KrO1+4tHdOfQ6p6GqmNtLDiWA5k4Ajr8ORLK4hMzg0skdERvPrclj6yoP24ku2gq6I1kSXhBdGirjoSExHBeNeAH8xJoTliOK5zaLe/K93g4MznOXlpyg8MGv1q0okM7zDINHOpN7ZVPi+cRbnBJWeNk6wEv+AgEN1MUVq50o1pmtY7dAzyAEjVM3enVXhA== 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: ce60c032-d0e6-4ac6-47bb-08df18882a0e X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:00.5793 (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: E1VeS5sDh4ZEXPprQL41CjaXCEPUciaO/clYjE8rOp/fo9ESRRe2UTjeYaNDHQbbLF/vf7SSqdzrFjfOxj1fhM7dPPAcsqiignQzl0FCTQo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5090 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: 1790067811577158500 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. Wait a short time before sending device_connect. Firmware often toggles the USB pull-up a few times while it starts its controller. If the host starts to enumerate while the device is off, we cannot answer its first request, and it only retries after a control timeout of several seconds. 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 --- include/hw/usb/redirect-server.h | 2 + hw/usb/redirect-server.c | 166 ++++++++++++++++++++++++++++++- hw/usb/trace-events | 7 ++ 3 files changed, 174 insertions(+), 1 deletion(-) diff --git a/include/hw/usb/redirect-server.h b/include/hw/usb/redirect-ser= ver.h index 2af881bda9..a3d5084424 100644 --- a/include/hw/usb/redirect-server.h +++ b/include/hw/usb/redirect-server.h @@ -31,12 +31,14 @@ struct USBRedirServer { =20 /* usbredir over the chardev */ struct usbredirparser *parser; + QEMUTimer *announce_timer; QEMUBH *chardev_close_bh; const uint8_t *read_buf; int read_buf_size; bool in_write; guint watch; bool host_connected; + bool device_announced; }; =20 #endif /* HW_USB_REDIRECT_SERVER_H */ diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index c36b5c16c4..824cd274b8 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -56,6 +56,8 @@ #include "qemu/main-loop.h" #include "qemu/module.h" #include "migration/vmstate.h" +#include "qemu/timer.h" +#include "qemu/cutils.h" #include "hw/usb/redirect-server.h" #include "hw/core/qdev-properties.h" #include "hw/core/qdev-properties-system.h" @@ -63,10 +65,115 @@ =20 #define USBREDIR_SERVER_VERSION "qemu " TYPE_USB_REDIR_SERVER " " QEMU_VER= SION =20 +/* Wait this long after attach before we announce the device. */ +#define USBREDIR_SERVER_ANNOUNCE_DEBOUNCE_MS 10 + +/* + * 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(USBRedirServer *s) +{ + 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 { + .speed =3D usbredir_server_speed(device), + }; + + if (s->device_announced) { + return; + } + s->device_announced =3D true; + + /* Put the device in DEFAULT state. The host may not reset the bus. */ + device->addr =3D 0; + device->state =3D USB_STATE_DEFAULT; + + /* 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_schedule_announce(USBRedirServer *s) +{ + USBDevice *device =3D usbredir_server_device(s); + + if (!s->host_connected || s->device_announced || !device || + !device->attached) { + return; + } + + timer_mod(s->announce_timer, + qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + + USBREDIR_SERVER_ANNOUNCE_DEBOUNCE_MS); +} + +static void usbredir_server_do_announce(void *opaque) +{ + USBRedirServer *s =3D opaque; + USBDevice *device =3D usbredir_server_device(s); + + /* Only announce if the device is still attached and the host is here.= */ + if (s->host_connected && s->parser && device && device->attached) { + usbredir_server_announce_device(s); + } +} + +static void usbredir_server_port_attach(USBPort *port) +{ + USBRedirServer *s =3D port->opaque; + + trace_usbredir_server_attach(); + usbredir_server_schedule_announce(s); +} + +static void usbredir_server_port_detach(USBPort *port) +{ + USBRedirServer *s =3D port->opaque; + + trace_usbredir_server_detach(s->device_announced); + + timer_del(s->announce_timer); + + 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. */ @@ -78,6 +185,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, }; @@ -181,13 +290,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; + usbredir_server_schedule_announce(s); +} + +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 /* @@ -211,6 +360,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= ); @@ -238,7 +395,10 @@ static void usbredir_server_create_parser(USBRedirServ= er *s) static void usbredir_server_destroy_parser(USBRedirServer *s) { s->host_connected =3D false; + s->device_announced =3D false; =20 + /* The announce timer may still be pending. */ + timer_del(s->announce_timer); g_clear_handle_id(&s->watch, g_source_remove); =20 if (s->parser) { @@ -336,6 +496,8 @@ static void usbredir_server_realize(DeviceState *dev, E= rror **errp) USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL | USB_SPEED_MASK_HIGH); =20 + s->announce_timer =3D timer_new_ms(QEMU_CLOCK_VIRTUAL, + usbredir_server_do_announce, s); s->chardev_close_bh =3D qemu_bh_new_guarded(usbredir_server_chardev_cl= ose_bh, s, &dev->mem_reentrancy_guar= d); =20 @@ -353,6 +515,8 @@ static void usbredir_server_unrealize(DeviceState *dev) qemu_chr_fe_deinit(&s->cs, true); usbredir_server_destroy_parser(s); =20 + timer_free(s->announce_timer); + if (s->chardev_close_bh) { qemu_bh_delete(s->chardev_close_bh); s->chardev_close_bh =3D NULL; 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.53.0 From nobody Sat Sep 26 20:00:47 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=1790067879; cv=pass; d=zohomail.com; s=zohoarc; b=UKAanNxnw0YJl7s9F98WxInUl4M76J8gHFGHGJzKQOd2xMQ7h/Gd4LffYMR7ATehJ8vmqnVYcNiElOwFUzwSoHZ20jTDsJYbzieBuMMgD1jqDPqTKimsmphmk/OEqAjI4nlF3ffmW2cK/PBKhttvmu2qhq/BCk4/N5aD2xjI3to= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067879; 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=9dSc1aOZciUwBVqu9coF7fAURGvKUoQbOu5jAogZV7Y=; b=LM4RtgJuEVe4T0PXWiiIEPjx6WkTk0TtTTJPx2i/aA6W91D8vcacZw6jxGeEgF00FZWFgRiykLBSVyxQzUKrsIZ6V92svF7mYavBnSCD5q67Uug2JLjPJcFGEFDh9zU9M7pYOPpmoM4qGijGhuBc9wtsPoGlbT0AAF+x3yIUS+w= 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 1790067879475565.5675519942846; Tue, 22 Sep 2026 02:04:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOQ-0007aM-9P; Tue, 22 Sep 2026 05:02:26 -0400 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 1x8wOM-0007XS-6R; Tue, 22 Sep 2026 05:02:22 -0400 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 1x8wOI-0002BR-NO; Tue, 22 Sep 2026 05:02:21 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5090.apcprd06.prod.outlook.com (2603:1096:4:1a9::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.15; Tue, 22 Sep 2026 09:02:01 +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.0428.015; Tue, 22 Sep 2026 09:02:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vQ9CUakel2H4AGVhZRHoaNZzoUQCuymVgvyPFbbaxeGSl5jB2GaukYcdRbhiTU2CqBBQxrw4qFmce1T0/M2xxxCtxHrQpDCQmQgxosS7IZ/FU/LaBqSTMB9yAu9JpiQlcA0KcBOC1UlP4hBoCQKRDDTh2/DoaWVh5z3kt4m12L54Rn8Djzk/hFhgmo9r/fL4EfSfWC9wxrx9QXo+1cD9P/uVjSs92BloBXtqxmoVib0prNnYoO3W0He+XbOXLzTDGl6Ve5VkaHDSZqoE/iWjmONWKgzDYJRJqPXwmGv4Rl3+dquHg54cAOuk9u6idvRaLyy3mewlLpbgBBpGsKNVIg== 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=9dSc1aOZciUwBVqu9coF7fAURGvKUoQbOu5jAogZV7Y=; b=VPfpseEXz1d3sdxASgGSUvULTjbucTaYL6pxOIBhPyph5lh3y3RkT+nKOVtA/zN7Xln3nFaxRQt+w/IM5lBXL3ZZoMl+lJctMWcO2PWpJPgln+OqUFnJ/qVjVm/6EnVdX/2EUscMC0TFRo+mvgsjyOLbqqkSMyxaQn3OcuwM1WYY92T0lwYkHLozZ59cMaBYn6q6YNNz5AJ7R76wCRn7QIxRszNEfB9qpBVUK0gQjNHqozTKfYhwTX9pnG6J2G6E06Io/j+5FdFEu4RKdxf7lUmngzjE+YVUckxCWn/ebDB4OoZcjayK9LpHiBtT4sBMDePUSPcsM3Vjy6Lodl3PNw== 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=9dSc1aOZciUwBVqu9coF7fAURGvKUoQbOu5jAogZV7Y=; b=TafunD4+xe8ULvbXNr4EgeG7kGcn2zm7qGS+TO72Ry4OLaXYEaHR/mQ9A/tTE1NXkIcyY/Rp9AcR2tXcWfGH8BecUeM7rgxOwuUG3/f3YT/xMMAxGGn+ipoI7jVX6emz5oIFtKCSG1hRaje6gg7vse2n3AmoHksbf5klwsT7hYPC6In0q4LY+KsaCjb0Y3GsGqk2OjyAmxmCp7SneOruatJ81ikRPIxgVq7xYaAYu5E90m/ZFGffeWn7HNvtWPASibE/Tehida99X/vKDxmjjeG7pKaQk4RMrZ/nqJ1fmOlnIsZOL+fvq/pcQejquM8wqItz9Q57fjL3Vy147TMcQg== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 05/19] hw/usb/redirect-server: Implement control transfers Thread-Topic: [PATCH v1 05/19] hw/usb/redirect-server: Implement control transfers Thread-Index: AQHdSnEINx4VCKY/KEyV6Eqji9fRNA== Date: Tue, 22 Sep 2026 09:02:01 +0000 Message-ID: <20260922090154.1792077-6-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|SI2PR06MB5090:EE_ x-ms-office365-filtering-correlation-id: 7881c1d6-b271-4df6-4c57-08df18882a81 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|23010399003|1800799024|376014|366016|38070700021|5023799004|6133799003|56012099006|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: kcSpXm/GI4Ry/ZrNqVCgiCanP8LSDPrJ08Iy05iN6Ff2U9zbFj+Gjp8FLOyBsCC8fwz4pD1XNMJZltgrSLJlykI1KG162nzyOAY0xj6O4Rr31ebNjbZ5qUbQd+/AGVZbqAeGIBYMSj0NPmvDoEfG/mT8T4JvmYDHtrtJ6VZe8wQcapiaJfqo0WM81mDcbFpShLNq5X13Bfgk5hmqP840+BAy/+FHGvECy0W1/OCKiS6K2WTDRYgJhL2b0r6u7wd82onlJNhORu0H5eqdq9VEAxrl/4NZgZdQYrmls+ZmO/nQnvqjghLhdgvjMedmoVgteySojVy07dcHIFDe7mvvzpWJO3wN9LBb724UZgG2pZh6F1HVB1rtAkTGcr2KRnQABhw/kt/RlhGHz81MHqLi58YImlCnTFk0hqpqXY00YvwY0AwZOt3HzoUkG0+8t6RHxCbjqwh19eDogGdPWw46v8N2bZ9T9luFXtgf/sd2ojuPwhIkwtCFK0VVrTpNcv23BBBkrEpTeAcViQh1CuERFIT7+VzNmIP6btgvvmlNMt8LmugvpptTFnY8yjvV4bNpNdwTnV3eA1LWL0OuDaq+alR+JMyydoC5wi8UdYrFhwzisWfAD9JKeiLCOAQH7++nZZdhgQz84ECjEPWaw/QUpxh+OOW8PZKJrLc//ufeBiwbuLGqlmduQuaBQMAKm80B13YgX1QCNBEveZv+WPYiA09eIkDQEc2rMX9SbeeJ29U= 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)(376014)(366016)(38070700021)(5023799004)(6133799003)(56012099006)(10067099003)(18002099003)(22082099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?IfSPKuEhHsdgd6YLb8ckElsoVxp2l0vkT8FENDA1A8z/zPg/sxe7fTRCBr?= =?iso-8859-1?Q?sWA7E0tIIDugbgxnlWFglqG1ejm6GSifcQ5u59Mg5J6SQ/l5z3KGwyAVg4?= =?iso-8859-1?Q?rS+oO7cnkS90lue+A3yc9UrPbLg5XII7mx6+AUkpWBQcsCD89ywZ/pdA83?= =?iso-8859-1?Q?5isCW0J5m9Yy+UI5YGEyrU3wBCf/Kvf4nCPvPdmfsAGV9TXKwR2IzaBTwp?= =?iso-8859-1?Q?Ww01dhQV9gIU5UuQpQz3aK2ao+mGRsMoFEFBjfMuHaPXXY18rj+2ISbeoY?= =?iso-8859-1?Q?U1CjEr7zfAghcrF3wn1pzssOYCLTkd2jRKv28oYdJ3z7GiMfrspIkcdmtk?= =?iso-8859-1?Q?+hNcYs/qHc5n8CD+w5PAZAVKlly6pahhTYVYM0AyzkND9LFYcxL8t0d2iU?= =?iso-8859-1?Q?Gp05wmnyQPHT71xdAu/HjrULRSO5B6/6MJYgk6ZsRXJavvQfh/T9U6jEwa?= =?iso-8859-1?Q?sagga9S2jExOdVDEa7t+UORkrfuVngmAA8LsMWxciXwubr36x+qI29QtxP?= =?iso-8859-1?Q?xlUpl41Xclg26e0qCJ87aIX/Fc1fy00XRBuPvLUmWHf0Ll6OFvXRpfOSkF?= =?iso-8859-1?Q?HU1f/k4mLrooSDOGUXSWgZ6ZdjNa1NfvbfaBorvN69SjnzMKvMfDt5a4BN?= =?iso-8859-1?Q?DZDdeG9NxX/hgBVTxgW0cp/1uEp/+yrZT1etTYi2K2e6+9Vy1uTxcpefFy?= =?iso-8859-1?Q?g99Wh0ZksI2mRhotCsWAi/Cys/EMpmXk5SyaWulTDSMepd6NMI3bD/17xD?= =?iso-8859-1?Q?hd+sdk9Brw5pycuo51XhZ/j/c45+8jevNzGWzloxNYNodWhWHy2hKde8Cs?= =?iso-8859-1?Q?oToHwl37Zpo+PDLOnEetX+Tn1uIsibTl1bEgadkA2hnFAQUpHtmuSuZfn/?= =?iso-8859-1?Q?6psHNUIV11cyiIMcxTigwSxx3f9MPBz6PFs5rDHNqxgZE/3soCidjhZS3w?= =?iso-8859-1?Q?TFPAChpcrRjqjptVolp8mcnmpI2xeiTYmTZu+Odw+JVeySuYTuAodz5z4/?= =?iso-8859-1?Q?RTqqvLZU3tR0X3SMby1iYoKPtto0FifUD7gyjx6wfPr3SLPO1DG2ceBGfW?= =?iso-8859-1?Q?FRZc4B3VtGcYajPktKb1AxjJ7Vbz7eh83jXYPfyNl3tdeabnJXBsHzMPaV?= =?iso-8859-1?Q?g+4v3jlLiWGaiX5yLLuN681qdduPvRmflnsFfYXcWHoyEZf9pqVCOvkDI6?= =?iso-8859-1?Q?coMf2G4hPtxhLcp1e/XLoGtYetGA25Xdmh/Hn2kOK3L85oYNIUemgcvayR?= =?iso-8859-1?Q?6t7i9ttTVwqDXLQiJfhqf3YFcS+NkHa0NU0TJK5zNDAtnvt10sV8eDsuB/?= =?iso-8859-1?Q?DSo468h3emMsRk2nuruXH8b8/FeWfqmpgaAThSMwd+9fWmyvah4geHaneo?= =?iso-8859-1?Q?7jQGi8A4IyJsnWDBr6Lbv+bsbF/WRPsIfLMrNEPlfxm3kbZx1S95U3b+Pl?= =?iso-8859-1?Q?nD2yl7daHTtypb8D4DrC+f4RngtWmSkoo68hLn1DP8gAlIQI9EwipUE4cq?= =?iso-8859-1?Q?jFpJ126dedDK34LGgk/+4cVBoElrtt0/D2O8hi3M1aiv2ZE1XdZWLW1+Ex?= =?iso-8859-1?Q?nd4TDu0qUSu6Z9pA8KHhuH18BgmhQMuqK5BCnRH5329dH6eHeSg825+sbg?= =?iso-8859-1?Q?wKYDbFJWJVBQKVXAyl1qCTCx4os6Z9UxnOPtdYn9+n/d3gPj+3FRbGkj50?= =?iso-8859-1?Q?RtovYFapbnJnDLUwrkKEvrmICMtIgDO3Y+uPBA0Y/p1LKaNL8h3t6ylaMZ?= =?iso-8859-1?Q?k3E4CJ4raXUR77HySH7T5jRbY/f1wJijPwo0qW/TnzxZfrglxTAlt7C96H?= =?iso-8859-1?Q?UNjwLb5x6w=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: cDWZAlAoEX7z5v5cSBqmkkde8lGLZzeuUtHyIM+6j71TyvPhzZbS+Dgfo57W+rvCXam3cJde59hbn+72XaK5Qq1DUuzgvLiExdHrILqN4/LqrV5K8FoBJGo6Kn05+8yfp10d2sZRGJtrojvX7Cnj1RO+UotnIoPLOA/t4tBGfP8uOTnhNn9yUUR3R5wFu+j2B5K/OMEnNEGCKPSWjJJUE2NLS18ZFD4YeDHCHuYc+poZ6bHPbUjxCR4FrMdTp40i8yrjbmq5edoKwe0PXXT5AOLqhnut2QpjVwTvA5c+S6rfehVFAC9mntYs4L5oc6L1XMMhwpQ25bHep/m1BG1DKw== 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: 7881c1d6-b271-4df6-4c57-08df18882a81 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:01.7463 (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: 3EXo/3+2gSH7wNHEoxy3gpbpvEPSKqfJEcqTSUHyqn4fM4IDg4DTqbQDbXUfvN7Mr5ZnuBVyImcyqgLJvqRkxNjas8r76l8wBMEE+E9pDhE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5090 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: 1790067881776158500 Content-Type: text/plain; charset="utf-8" The host sends a control_packet. Turn it into the SETUP, DATA and STATUS tokens the QEMU USB core wants, run them on the device, and send the answer back. 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. 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: bulk, interrupt or control. 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. Signed-off-by: Jamin Lin --- include/hw/usb/redirect-server.h | 46 +++ hw/usb/redirect-server.c | 603 ++++++++++++++++++++++++++++++- hw/usb/trace-events | 5 + 3 files changed, 653 insertions(+), 1 deletion(-) diff --git a/include/hw/usb/redirect-server.h b/include/hw/usb/redirect-ser= ver.h index a3d5084424..83c4524040 100644 --- a/include/hw/usb/redirect-server.h +++ b/include/hw/usb/redirect-server.h @@ -15,10 +15,46 @@ #include "qom/object.h" =20 #include +#include =20 #define TYPE_USB_REDIR_SERVER "usb-redir-server" OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SERVER) =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 + +#define USBREDIR_SERVER_CTRL_SETUP 0 +#define USBREDIR_SERVER_CTRL_STATUS 1 + +/* 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; + +typedef struct USBRedirServerPkt { + USBPacket pkt; + + /* Saved headers 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; data_size is how big it is. + */ + uint8_t *data; + int data_size; + QTAILQ_ENTRY(USBRedirServerPkt) next; + USBRedirServerReply reply; + uint64_t redir_id; + int type; +} USBRedirServerPkt; + struct USBRedirServer { SysBusDevice parent_obj; =20 @@ -39,6 +75,16 @@ struct USBRedirServer { guint watch; bool host_connected; bool device_announced; + + /* In-flight packet tracking */ + QTAILQ_HEAD(, USBRedirServerPkt) inflight; + uint64_t next_id; + + /* Endpoint tables for the usbredir ep_info message. */ + uint8_t ep_type[USBREDIR_SERVER_MAX_EP]; + uint16_t ep_max_packet[USBREDIR_SERVER_MAX_EP]; + uint8_t ep_interval[USBREDIR_SERVER_MAX_EP]; + uint8_t ep_iface[USBREDIR_SERVER_MAX_EP]; }; =20 #endif /* HW_USB_REDIRECT_SERVER_H */ diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index 824cd274b8..5005ea5f8a 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -61,6 +61,7 @@ #include "hw/usb/redirect-server.h" #include "hw/core/qdev-properties.h" #include "hw/core/qdev-properties-system.h" +#include "desc.h" #include "trace.h" =20 #define USBREDIR_SERVER_VERSION "qemu " TYPE_USB_REDIR_SERVER " " QEMU_VER= SION @@ -68,6 +69,11 @@ /* Wait this long after attach before we announce the device. */ #define USBREDIR_SERVER_ANNOUNCE_DEBOUNCE_MS 10 =20 +static void usbredir_server_pkt_free(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. @@ -78,8 +84,97 @@ static USBDevice *usbredir_server_device(USBRedirServer = *s) } =20 /* - * Device announcement + * Descriptor snooping and device announcement + */ + +static void usbredir_server_record_endpoint(USBRedirServer *s, + const USBDescriptor *desc, + uint8_t iface) +{ + uint8_t addr; + int ep_nr; + int idx; + + if (desc->bLength < 7) { + return; + } + + addr =3D desc->u.endpoint.bEndpointAddress; + ep_nr =3D addr & 0x0f; + idx =3D (addr & USB_DIR_IN) ? ep_nr + USBREDIR_SERVER_EP_IN_BASE : ep_= nr; + if (ep_nr < 1 || idx >=3D USBREDIR_SERVER_MAX_EP) { + return; + } + + s->ep_type[idx] =3D desc->u.endpoint.bmAttributes & 0x03; + s->ep_max_packet[idx] =3D (desc->u.endpoint.wMaxPacketSize_hi << 8) | + desc->u.endpoint.wMaxPacketSize_lo; + s->ep_interval[idx] =3D desc->u.endpoint.bInterval; + s->ep_iface[idx] =3D iface; +} + +/* + * A device that only passes transfers through never gets its endpoint + * types filled in: they stay INVALID and there is nothing to put in + * ep_info. Take them from the configuration descriptor as it goes past. + * Without them the host sees type 255 and refuses to move data. */ +static void usbredir_server_snoop_config_desc(USBRedirServer *s, + const uint8_t *data, int len) +{ + const USBDescriptor *desc; + uint8_t iface =3D 0; + int i =3D 0; + + while (i + 2 <=3D len) { + desc =3D (const USBDescriptor *)(data + i); + + if (desc->bLength < 2 || i + desc->bLength > len) { + break; + } + + if (desc->bDescriptorType =3D=3D USB_DT_INTERFACE && desc->bLength= >=3D 3) { + iface =3D desc->u.interface.bInterfaceNumber; + } else if (desc->bDescriptorType =3D=3D USB_DT_ENDPOINT) { + usbredir_server_record_endpoint(s, desc, iface); + } + + i +=3D desc->bLength; + } +} + +static void usbredir_server_send_ep_info(USBRedirServer *s) +{ + struct usb_redir_ep_info_header ep_info =3D {}; + int i; + + for (i =3D 0; i < USBREDIR_SERVER_MAX_EP; i++) { + ep_info.type[i] =3D s->ep_type[i]; + ep_info.max_packet_size[i] =3D s->ep_max_packet[i]; + ep_info.interface[i] =3D s->ep_iface[i]; + /* + * 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 send 1 instead. + */ + ep_info.interval[i] =3D s->ep_interval[i]; + if (ep_info.interval[i] =3D=3D 0 && + (s->ep_type[i] =3D=3D USB_ENDPOINT_XFER_INT || + s->ep_type[i] =3D=3D USB_ENDPOINT_XFER_ISOC)) { + ep_info.interval[i] =3D 1; + } + if (s->ep_type[i] !=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); +} =20 static uint8_t usbredir_server_speed(USBDevice *device) { @@ -119,6 +214,146 @@ static void usbredir_server_announce_device(USBRedirS= erver *s) 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; + } +} + +/* + * The device answered the setup token of an IN control request. What it + * wants to send is now in device->data_buf, so run the data and status + * stages and pass the answer to the host. + * + * Each stage reuses rp->pkt, and usb_packet_setup() asserts iov->iov is + * not NULL, so call qemu_iovec_init() before every stage. + */ +static void usbredir_server_ctrl_setup_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + struct usb_redir_control_packet_header resp =3D rp->ctrl_hdr; + struct usb_redir_configuration_status_header cfg =3D {}; + struct usb_redir_alt_setting_status_header alt =3D { + .interface =3D rp->ctrl_hdr.index, + }; + USBDevice *device =3D usbredir_server_device(s); + USBEndpoint *ep_out =3D usb_ep_get(device, USB_TOKEN_OUT, 0); + USBEndpoint *ep_in =3D usb_ep_get(device, USB_TOKEN_IN, 0); + uint8_t status =3D usbredir_server_status(rp->pkt.status); + int actual =3D 0; + + if (rp->pkt.status =3D=3D USB_RET_SUCCESS) { + /* Data stage: the core copies device->data_buf into our buffer. */ + qemu_iovec_init(&rp->pkt.iov, 1); + usb_packet_setup(&rp->pkt, USB_TOKEN_IN, ep_in, + 0, s->next_id++, false, false); + usb_packet_addbuf(&rp->pkt, rp->data, rp->data_size); + usb_handle_packet(device, &rp->pkt); + actual =3D rp->pkt.actual_length; + usb_packet_cleanup(&rp->pkt); + + /* Status stage: tell the device we got it. Its EP0 goes idle. */ + qemu_iovec_init(&rp->pkt.iov, 1); + usb_packet_setup(&rp->pkt, USB_TOKEN_OUT, ep_out, + 0, s->next_id++, false, false); + usb_handle_packet(device, &rp->pkt); + usb_packet_cleanup(&rp->pkt); + + if (rp->ctrl_hdr.request =3D=3D USB_REQ_GET_DESCRIPTOR && + (rp->ctrl_hdr.value >> 8) =3D=3D USB_DT_CONFIG && actual > 0) { + usbredir_server_snoop_config_desc(s, rp->data, actual); + } + } + + trace_usbredir_server_ctrl_setup_complete(rp->redir_id, status, + actual); + + switch (rp->reply) { + case USBREDIR_SERVER_REPLY_CONTROL: + resp.status =3D status; + resp.length =3D actual; + usbredirparser_send_control_packet(s->parser, rp->redir_id, &resp, + actual > 0 ? rp->data : NULL, + actual); + break; + case USBREDIR_SERVER_REPLY_CONFIG: + cfg.status =3D status; + cfg.configuration =3D actual > 0 ? rp->data[0] : 0; + usbredirparser_send_configuration_status(s->parser, rp->redir_id, + &cfg); + break; + case USBREDIR_SERVER_REPLY_ALT: + alt.status =3D status; + alt.alt =3D actual > 0 ? rp->data[0] : 0; + usbredirparser_send_alt_setting_status(s->parser, rp->redir_id, + &alt); + break; + } + usbredirparser_do_write(s->parser); +} + +/* + * The status stage of an OUT control request finished, so the device is + * done. Tell the host how it went, with whichever message it is waiting + * for. + */ +static void usbredir_server_ctrl_status_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + struct usb_redir_control_packet_header resp =3D rp->ctrl_hdr; + uint8_t status =3D usbredir_server_status(rp->pkt.status); + struct usb_redir_configuration_status_header cfg =3D { + .configuration =3D rp->ctrl_hdr.value, + }; + struct usb_redir_alt_setting_status_header alt =3D { + .interface =3D rp->ctrl_hdr.index, + .alt =3D rp->ctrl_hdr.value, + }; + + trace_usbredir_server_ctrl_status_complete(rp->redir_id, status); + + switch (rp->reply) { + case USBREDIR_SERVER_REPLY_CONTROL: + resp.status =3D status; + resp.length =3D 0; + usbredirparser_send_control_packet(s->parser, rp->redir_id, + &resp, NULL, 0); + break; + case USBREDIR_SERVER_REPLY_CONFIG: + cfg.status =3D status; + usbredirparser_send_configuration_status(s->parser, rp->redir_id, + &cfg); + break; + case USBREDIR_SERVER_REPLY_ALT: + alt.status =3D status; + usbredirparser_send_alt_setting_status(s->parser, rp->redir_id, + &alt); + break; + } + usbredirparser_do_write(s->parser); + + /* The endpoint list changed. Send the new one. */ + if (status =3D=3D usb_redir_success && + (rp->ctrl_hdr.request =3D=3D USB_REQ_SET_CONFIGURATION || + rp->ctrl_hdr.request =3D=3D USB_REQ_SET_INTERFACE)) { + usbredir_server_send_ep_info(s); + } } =20 /* @@ -166,12 +401,20 @@ static void usbredir_server_port_detach(USBPort *port) =20 timer_del(s->announce_timer); =20 + usbredir_server_stop_transfers(s); + 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; + + /* Clear the endpoint tables: they belong to the device that is leavin= g. */ + memset(s->ep_type, USB_ENDPOINT_XFER_INVALID, sizeof(s->ep_type)); + memset(s->ep_max_packet, 0, sizeof(s->ep_max_packet)); + memset(s->ep_interval, 0, sizeof(s->ep_interval)); + memset(s->ep_iface, 0, sizeof(s->ep_iface)); } =20 static void usbredir_server_port_child_detach(USBPort *port, USBDevice *ch= ild) @@ -184,11 +427,42 @@ static void usbredir_server_port_wakeup(USBPort *port) /* 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_submit_to_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); + + QTAILQ_REMOVE(&s->inflight, rp, next); + usb_packet_cleanup(&rp->pkt); + + if (!s->parser || !device) { + usbredir_server_pkt_free(rp); + return; + } + + switch (rp->type) { + case USBREDIR_SERVER_CTRL_SETUP: + usbredir_server_ctrl_setup_complete(s, rp); + break; + case USBREDIR_SERVER_CTRL_STATUS: + usbredir_server_ctrl_status_complete(s, rp); + break; + } + + usbredir_server_pkt_free(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 /* @@ -198,6 +472,54 @@ static USBPortOps usbredir_server_port_ops =3D { static USBBusOps usbredir_server_bus_ops =3D { }; =20 +/* + * Submit a packet to the device. The core only calls our completion + * callback when the device answers USB_RET_ASYNC, so call it here for + * the rest. + */ +static void usbredir_server_submit_to_device(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + QTAILQ_INSERT_TAIL(&s->inflight, rp, next); + usb_handle_packet(usbredir_server_device(s), &rp->pkt); + if (rp->pkt.status !=3D USB_RET_ASYNC) { + usbredir_server_packet_complete(&s->port, &rp->pkt); + } +} + +static USBRedirServerPkt *usbredir_server_pkt_alloc(int size) +{ + USBRedirServerPkt *rp =3D g_new0(USBRedirServerPkt, 1); + + qemu_iovec_init(&rp->pkt.iov, 1); + rp->data =3D g_malloc0(size); + rp->data_size =3D size; + return rp; +} + +static void usbredir_server_pkt_free(USBRedirServerPkt *rp) +{ + g_free(rp->data); + g_free(rp); +} + +/* + * Take @rp off the list and free it. Do not use usb_packet_complete(): + * it calls back into usbredir_server_packet_complete(), which would + * remove the entry a second time and free it. usb_cancel_packet() only + * tells the device to let go. + */ +static void usbredir_server_drop_pkt(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + QTAILQ_REMOVE(&s->inflight, rp, next); + if (usb_packet_is_inflight(&rp->pkt)) { + usb_cancel_packet(&rp->pkt); + } + usb_packet_cleanup(&rp->pkt); + usbredir_server_pkt_free(rp); +} + /* * usbredirparser I/O and logging callbacks */ @@ -313,9 +635,199 @@ 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 *ep_out; + USBEndpoint *ep_in; + USBEndpoint *ep0; + bool is_in; + int size; + + if (!s->host_connected || !device || !device->attached) { + return; + } + + trace_usbredir_server_control(id, hdr->requesttype, hdr->request, + hdr->value, hdr->index, hdr->length); + + is_in =3D !!(hdr->requesttype & USB_DIR_IN); + + ep0 =3D usb_ep_get(device, USB_TOKEN_SETUP, 0); + + /* Room for the setup bytes and for the data of either direction. */ + size =3D MAX(hdr->length, data_len); + size =3D MAX(size, (int)sizeof(device->setup_buf)); + + rp =3D usbredir_server_pkt_alloc(size); + rp->redir_id =3D id; + rp->reply =3D reply; + rp->ctrl_hdr =3D *hdr; + + /* + * Build the raw 8-byte SETUP packet in rp->data. The IN path + * overwrites it later with the answer from the device. + */ + rp->data[0] =3D hdr->requesttype; + rp->data[1] =3D hdr->request; + rp->data[2] =3D hdr->value & 0xff; + rp->data[3] =3D (hdr->value >> 8) & 0xff; + rp->data[4] =3D hdr->index & 0xff; + rp->data[5] =3D (hdr->index >> 8) & 0xff; + rp->data[6] =3D hdr->length & 0xff; + rp->data[7] =3D (hdr->length >> 8) & 0xff; + + if (is_in) { + /* + * An IN request. The device starts the work on the setup token + * and may take its time, so send the token and pick the rest up + * in usbredir_server_ctrl_setup_complete(). + */ + rp->type =3D USBREDIR_SERVER_CTRL_SETUP; + usb_packet_setup(&rp->pkt, USB_TOKEN_SETUP, ep0, + 0, s->next_id++, false, false); + usb_packet_addbuf(&rp->pkt, rp->data, sizeof(device->setup_buf)); + usbredir_server_submit_to_device(s, rp); + } else { + /* + * An OUT request. The device only stores the setup bytes now and + * does the work on the status stage, so run the first two stages + * here and wait on the last one. + */ + ep_in =3D usb_ep_get(device, USB_TOKEN_IN, 0); + ep_out =3D usb_ep_get(device, USB_TOKEN_OUT, 0); + + /* Setup stage: hand the device the 8 setup bytes. */ + usb_packet_setup(&rp->pkt, USB_TOKEN_SETUP, ep0, + 0, s->next_id++, false, false); + usb_packet_addbuf(&rp->pkt, rp->data, sizeof(device->setup_buf)); + usb_handle_packet(device, &rp->pkt); + usb_packet_cleanup(&rp->pkt); + + /* Data stage: send the bytes that came with the request. */ + if (data_len > 0) { + memcpy(rp->data, data, data_len); + qemu_iovec_init(&rp->pkt.iov, 1); + usb_packet_setup(&rp->pkt, USB_TOKEN_OUT, ep_out, + 0, s->next_id++, false, false); + usb_packet_addbuf(&rp->pkt, rp->data, data_len); + /* The core copies our bytes into device->data_buf. */ + usb_handle_packet(device, &rp->pkt); + usb_packet_cleanup(&rp->pkt); + } + + /* Status stage: the device does the work here, so wait for it. */ + rp->type =3D USBREDIR_SERVER_CTRL_STATUS; + qemu_iovec_init(&rp->pkt.iov, 1); + usb_packet_setup(&rp->pkt, USB_TOKEN_IN, ep_in, + 0, s->next_id++, false, false); + /* async; the answer comes in usbredir_server_ctrl_status_complete= () */ + usbredir_server_submit_to_device(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) +{ + usbredir_server_do_control(priv, id, hdr, data, data_len, + USBREDIR_SERVER_REPLY_CONTROL); +} + +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(); @@ -339,6 +851,84 @@ 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) +{ + struct usb_redir_control_packet_header resp =3D { + .endpoint =3D 0, + .status =3D usb_redir_cancelled, + .length =3D 0, + }; + USBRedirServer *s =3D priv; + USBRedirServerPkt *rp; + + /* + * The host has put this id in its cancelled queue and waits for one + * answer carrying it. The device may have answered already, so the + * request may no longer be on our list. Answer in both cases: the + * host reuses ids, and a leftover entry would eat a later answer. + */ + QTAILQ_FOREACH(rp, &s->inflight, next) { + if (rp->redir_id =3D=3D id) { + trace_usbredir_server_cancel(id, true); + usbredir_server_send_cancelled(s, rp); + usbredir_server_drop_pkt(s, rp); + return; + } + } + + /* + * Already finished, so we no longer know what kind of transfer it + * was. The host retires the entry on the id alone, and its control + * handler ignores the endpoint field, so a control packet always + * works. + */ + trace_usbredir_server_cancel(id, false); + usbredirparser_send_control_packet(s->parser, id, &resp, NULL, 0); + usbredirparser_do_write(s->parser); +} + +/* + * 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_SETUP: + case USBREDIR_SERVER_CTRL_STATUS: + 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; + + /* + * 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_drop_pkt(s, rp); + } +} + /* * Parser setup and teardown */ @@ -361,13 +951,19 @@ static void usbredir_server_create_parser(USBRedirSer= ver *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= ); @@ -401,6 +997,8 @@ static void usbredir_server_destroy_parser(USBRedirServ= er *s) timer_del(s->announce_timer); 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; @@ -489,6 +1087,9 @@ static void usbredir_server_realize(DeviceState *dev, = Error **errp) return; } =20 + QTAILQ_INIT(&s->inflight); + memset(s->ep_type, USB_ENDPOINT_XFER_INVALID, sizeof(s->ep_type)); + /* One port: usbredir carries a single device. */ usb_bus_new(&s->bus, sizeof(s->bus), &usbredir_server_bus_ops, dev); s->bus.no_auto_hub =3D true; diff --git a/hw/usb/trace-events b/hw/usb/trace-events index 2cc6a244b9..25219a018a 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -406,3 +406,8 @@ 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" +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_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_ctrl_setup_complete(uint64_t id, int status, int actual) "= id %" PRIu64 " status %d actual %d" +usbredir_server_ctrl_status_complete(uint64_t id, int status) "id %" PRIu6= 4 " status %d" --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067937; cv=pass; d=zohomail.com; s=zohoarc; b=Yu6FMtufAjdmbDKBvT5lVSi0gHlKoWSUi//mEL7iSY+G+osDdgkx9ZX93pRdVZ161m8laiqIi4dQAS0oLrKTOtIgxFvcpDktyZvBs4VOw6a1w1WStyzH4+ljfCrewJQeL9y6FkTIlcZAb1J9vhxZqzYOMNxzwprurHSLNnjijts= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067937; 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=ruenKFtUM7UzHY/uPz9dr4ueL6wb67G2b6e4NfL52/U=; b=E7vEjAeM+Z50ScHrBgfFtlESWPxbBrEXyyoRGYQ0GPf6wtSVc7i3CzdBwXRBv9m9sWJNcx5HdRskTCs46Y2RamZoObW21Y4TVUhHYIIk+opptqXcIiwM3oBOpaj4zxG27xR/d6POB5ul8F6osqunLicmxUdYvKMQ6LgqnNNYzwU= 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 1790067937406739.1731836498999; Tue, 22 Sep 2026 02:05:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOR-0007am-GV; Tue, 22 Sep 2026 05:02:27 -0400 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 1x8wON-0007Yy-MJ; Tue, 22 Sep 2026 05:02:23 -0400 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 1x8wOL-0002Bc-9i; Tue, 22 Sep 2026 05:02:23 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by SI2PR06MB5090.apcprd06.prod.outlook.com (2603:1096:4:1a9::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.15; Tue, 22 Sep 2026 09:02:03 +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.0428.015; Tue, 22 Sep 2026 09:02:03 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ll1FX3gc080kFqk2ZmKOm2M9X6QCQCG45KQTk8PBSXhTL2RaWctErTB8pEW5EsUtuEN4q0pdQbsDpTApTrp0oDxJi51GxsPr0wRVkLTf/TD7t9GrKufnEnH69nj4gkSlzYwo8Wd36wIV/k5tiJ5p6W/Epjb1WsjpNh1uiurI6gNNNHu1Cq11QeZ3xukFeM+KqFcrqVFKn/wYWUcyozq9BljQN5gMiQ88+jur1qIFgqG2LtztQT+Yzi4fAifi2uJ2nqjc49aE0Ap2FOwxjm9OAyzOSv3mrY2+UOm/jZLDYILWTBkKSDIBIldonZ5ja2QwV4pThvfjiIVaXbykUTpxFw== 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=ruenKFtUM7UzHY/uPz9dr4ueL6wb67G2b6e4NfL52/U=; b=H3w5dW9GCOMLm7y/5IL03qM78NjXbBWRppoVdhKpFhhR3exaoufe5fE+FLdOBC5feZR52lICAxZ/n531tihNLd8DnLc2a89MD8Mhg4u1FBsk//o5rvIMeLbSVdC/sRCIdz9Y09Xo5FOvoSdI49cWRiHkn6Jh1g0z4m1NLtin7/oxPvWHIyv7ewjbrqsg/wfsyEYqi0JUU/Jve62dOKwwg9NPMddO1PPmJ+crSgG9+wDBXRap/yGgCJvQWArE3nLxGbLjczSSGVlhKZ3QVr9CrU86TFonIbYJ/MIS/lDS83SHPTKsFjQRuPr3nBnbWEnz5I+vb/5KARscu8sFNyy7cA== 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=ruenKFtUM7UzHY/uPz9dr4ueL6wb67G2b6e4NfL52/U=; b=e98EZ3jJuoqtbbNJEGzLcJ41qNEr/NPZ8EwzGScdN5mMhll5onJE2jf0fGXVhsaE4UQU3FAdi8gWd3Qz9qDYYwC0eufRb72epGeNmXdmDyzldtHwdWw4Z3FXUFJTkK9A5c19qmR8UvpKeclG92VfIt2UVCBwS1Nx09TVo6nxZXJgBWRv7xs2yQozwUQJdmB9oemgvTnfW1LMDzbXkcgfQ5U/0Uvv21ADUb8QbFuxh/J7acSkTCq8qA9T0uVFp+4PIoE9tyUtjkvICQkv63WJv0ynu3wjiB6Z70J0Jp7L3GgQwPJrxTWBGfcuWckU+f0tVABKGWMTK1SbgrsLnG/zFg== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 06/19] hw/usb/redirect-server: Implement bulk and interrupt transfers Thread-Topic: [PATCH v1 06/19] hw/usb/redirect-server: Implement bulk and interrupt transfers Thread-Index: AQHdSnEIghL6s6qOb0S+dK8A4y8Quw== Date: Tue, 22 Sep 2026 09:02:03 +0000 Message-ID: <20260922090154.1792077-7-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|SI2PR06MB5090:EE_ x-ms-office365-filtering-correlation-id: 02650124-8836-4a00-3b89-08df18882b60 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|23010399003|1800799024|376014|366016|38070700021|5023799004|6133799003|56012099006|10067099003|18002099003|22082099003; x-microsoft-antispam-message-info: Qg9vqdWEIHDM0exFI3I3Ze9AzQKDN+z1E2c6pe/NeX7aHZGUMT4rbaMQqJT15RNAslaRfMbSsCIhp3CBn2makDHa4uMW140+U+8S/H+v2X1ndDKgKxPuBfN2QH91hUvkM8XPn+q/jBL2tkI+yNyPmEavCzAOdC8bPIoebvTBVzWjU0g+lpWGoJXQBmTCWZLzo9hUEdAn2j7GJ/6Ch1D3NigAD9VnHnsgnSldEhUyys1yQFktYo5u7aXeScI5SrLc6Uhtgjpjx+lkZNupNLp7aRhQObD1XWHjytJeFs6+KzsJEL9av2V+2i+1+7+qbgbf61m3thKQ8eKHG9bNQ1MIWePbU82v4V+uqsbClt04ZIqak8b5IWM1zjnDPFWNsY6XwDjrUxO4lSGwOEDqJW1Js5qOhpyiRt1b2f3Gy75AU0N/1Dn2N87BzDdu0GENa2YFZG7nwmm5icCsELY3Kft9A4xv67PFl4b3/AKmjnJrbqseogzXxu4ZEu8c34hlTn+ClnyI3+XUEaVcMmFjongyBVdA5VuULGri27bt3ymSa+x1yH2FoLOTGj8x1O0mEfG1jbJcNC0pIIEp4VfBECtoJsApV/PjqYmNiCQr2kWXx+AHjitLnP2quDwevnqP2zB+BHlFfQ+JeVK1Bgv4ro/wt69ccGGxHOVeQBZZXxEOVhoPCnIb7LtlSoNvMugbDs/Efer17Rp3VePw75I/A8Q1FloWovP/JWErHw1Aa5RUNhM= 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)(376014)(366016)(38070700021)(5023799004)(6133799003)(56012099006)(10067099003)(18002099003)(22082099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?3FVJNeJ4PhzXKf5DLINLcAW+z9Zwo3u49+o4usmqa9/frWmgvwdxJWPfsL?= =?iso-8859-1?Q?QHC+gogdpZE9ni/74Wo3mFN8hrCCuW19giJn7oAVFj8K1fHktL1NPpOAOi?= =?iso-8859-1?Q?/MVzf716ObwwZh1Tl5fvfQhzWb/IRIdoXOGG0llP866MqVi5f+O+BbXKgx?= =?iso-8859-1?Q?otipgK5YrSsARqvUWf5qfvhYamvYSu0+HgLI/1p4NcJ2ciotZCPsNv98K3?= =?iso-8859-1?Q?+8KrUIIckEgIx+21Kj3X/gGwW1P4RM/70Uf+PE0j7CkUbQj48cu0G81syF?= =?iso-8859-1?Q?z5BZAkOIQ6JcACEIOPyh6Trcj6QXRb6SazPw7JXgO4rivJ4QIOzC0cs2iM?= =?iso-8859-1?Q?IUxrmRs0HT4eou+BjN83Y1eMGrmX5tFxwNRNBjqhkR+LXEgnfW5j+qgnLF?= =?iso-8859-1?Q?u1bHeK3HUGHxXcwxs/FcH2rz6RXRFhBelNaEZ53U1c084Ljc/k4bZuJq0u?= =?iso-8859-1?Q?eNUNA+AkbyVLPYIHnf6DywZlC4Z5t94c5HzyDl3fe7rJmbDe+tRWm323oT?= =?iso-8859-1?Q?LoHacWajS27gB1XOMDjGU6ZVS+T877MhnY5dTx1qmBSDdYJqvU7WcsPjIl?= =?iso-8859-1?Q?e4Ao+v/jJBRV7Kt/y2Ip4JOXH/etzxFsDhVkXU8zVEg0GIo4io5xG83gvw?= =?iso-8859-1?Q?sP3TP1rOG39KNqtV9csFMrbyHEOQcuXL+PzXShgrKqwAMEtoR47y+B5agv?= =?iso-8859-1?Q?m6FIgPitqMCKhF0tKkmEE0cpa0gJxwifO6C7n5yW1SNdboEaY/lRsemwKZ?= =?iso-8859-1?Q?4ZQIwM/tniJlrSAsF92C1UfYia/yTHH4k5dDyH1ZJbJi/fVuu4e+P8B3c0?= =?iso-8859-1?Q?R1bO7aRdjAiyRet23jXQbgH1xUdL77SdZ85DTQEtUGGAJF0fwUv3TIvwrz?= =?iso-8859-1?Q?//aegwpRSUcUk0yRMnqS7uMk2bst/orRoMUGAlK+PejT5qAhXcpeXyxiSQ?= =?iso-8859-1?Q?Bhow/qIgXoX2eXWSgTPTWyTG2xJtjG4IPTrBCE9AnaTmSPyOacpAQ+QG6w?= =?iso-8859-1?Q?iZI3f+LAjnBVdIHWeYg/s9GeFf+0rkGS+/EjLoxi2zMJdc1aVWgig1WLrk?= =?iso-8859-1?Q?aWRJPppHkA53M7s1d+NMAGzjaavxuHk/tDHkEmp9gzAvpdXt5lhRxglbD3?= =?iso-8859-1?Q?VBHHY+qUsaTdXXSDsnPy0fvstH8Lkvhh7Mn92D1Zzh4jpSQvk2YKSSqjB7?= =?iso-8859-1?Q?HNKvB1GlirRlOrArdtd2R4QWUnB7jJgGIlM7snFdApxP7sNpQMG93gyDp+?= =?iso-8859-1?Q?bKPuqotFRqxWiIMHikmi5MLqAiqKJ2JSbtYxABr4VlL7Ar0kEOXx8VRlGa?= =?iso-8859-1?Q?a5wv1nztod0ydsc1qrTeiU35UBrfJwhbOsqw+r9WAShL4MV2ecR3+9cLST?= =?iso-8859-1?Q?k6I5+7Y1fpIjxFFULRvUtktnz+qJweGL9tEhgFZTsCTPxjQD1Loascsr/q?= =?iso-8859-1?Q?3yteah4Z0U93HM5nWzTDrAc8mqXmQMdFrwnlxfzswIFSVyMSdVGPWJ1zmY?= =?iso-8859-1?Q?EOEv4HnC4VL9lEygvwcCn4eWCEhpFa9aBvp+mAYcSVsOoA2uwxP5P7A0n8?= =?iso-8859-1?Q?aeOonqZekcS25ZbwiiOJVtfTnQg6n1+m+VjfpixTzaAwiwtY0kqhTcRTUM?= =?iso-8859-1?Q?w4I8BILOpUWaFRAWP2FY6QY9eZhY22c0Lvyx0x5Q7NYVLykmFz0joPEzlN?= =?iso-8859-1?Q?uyxoTSvYkXK1oZH8n920Tc13fNuHHHHWJl3cuz41MuLj8lKzi2qnaMcaiy?= =?iso-8859-1?Q?P+knTu6rYinb6EUmuDz4c+H3z63jqcusbFURMX9w+BfW7ZQ+d4svMzPNLZ?= =?iso-8859-1?Q?Yv+o4/KY+g=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: M2oi3wv2sgO0UoGzhpBF7cQnEr7QBii92Tpsg+xsnaTcXbaBsuw8ec2IutMiGpDPJV81IyQoFzItaw93b333ZMOr23aYMCyHZnHBQ9osxE7Ne0YtF+vwjxNYsRvM8Z9E0TYYqE7FltZvfPhqpXmS0pn42ELVRyxH74nkTmNcqGotl2ztncu6tD13QMPxOlG4QS5D9V756GE/Q9fyEG8SNpqjUIvbwVMeSm+ljb/EugO7+aG6sbILRKh3rFjd3qUTAe6JxX02TXr+HsKnVnZLBI0PiRW8UqIT5TeenwmWHaNDoHbdjIDfkZfNDeiUiwW1o05stwtW6BIQwMSDrQcPFA== 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: 02650124-8836-4a00-3b89-08df18882b60 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:03.2198 (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: P247/6icC82ZplIqDTPD3iFUV5qLYr8W3Ae9yYmxJWhFhp23+2QAQoo14dFxyc8wO8ElU5lB7dpjOxCfj3ANwvYWHrgw4VNOLQ0uQLZ+oFY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SI2PR06MB5090 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: 1790067939840158500 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 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. Signed-off-by: Jamin Lin --- include/hw/usb/redirect-server.h | 11 ++ hw/usb/redirect-server.c | 193 +++++++++++++++++++++++++++++++ hw/usb/trace-events | 5 + 3 files changed, 209 insertions(+) diff --git a/include/hw/usb/redirect-server.h b/include/hw/usb/redirect-ser= ver.h index 83c4524040..f7b2261db4 100644 --- a/include/hw/usb/redirect-server.h +++ b/include/hw/usb/redirect-server.h @@ -9,6 +9,7 @@ #ifndef HW_USB_REDIRECT_SERVER_H #define HW_USB_REDIRECT_SERVER_H =20 +#include "qemu/units.h" #include "hw/core/sysbus.h" #include "hw/usb/usb.h" #include "chardev/char-fe.h" @@ -27,8 +28,16 @@ OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SER= VER) #define USBREDIR_SERVER_MAX_EP 32 #define USBREDIR_SERVER_EP_IN_BASE 16 =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_SETUP 0 #define USBREDIR_SERVER_CTRL_STATUS 1 +#define USBREDIR_SERVER_BULK 2 +#define USBREDIR_SERVER_INTR 3 =20 /* Which message answers the host when a control transfer ends. */ typedef enum { @@ -41,7 +50,9 @@ typedef struct USBRedirServerPkt { USBPacket pkt; =20 /* Saved headers 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. diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index 5005ea5f8a..a733a007e3 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -356,6 +356,52 @@ static void usbredir_server_ctrl_status_complete(USBRe= dirServer *s, } } =20 +static void usbredir_server_bulk_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + struct usb_redir_bulk_packet_header resp =3D rp->bulk_hdr; + bool is_in =3D !!(rp->bulk_hdr.endpoint & USB_DIR_IN); + int actual =3D rp->pkt.actual_length; + int len; + + resp.status =3D usbredir_server_status(rp->pkt.status); + + /* Only an IN transfer carries data back. */ + len =3D is_in ? actual : 0; + resp.length =3D len; + resp.length_high =3D len >> 16; + + trace_usbredir_server_bulk_complete(rp->redir_id, resp.endpoint, + resp.status, actual); + + usbredirparser_send_bulk_packet(s->parser, rp->redir_id, &resp, + len > 0 ? rp->data : NULL, len); + usbredirparser_do_write(s->parser); +} + +static void usbredir_server_intr_complete(USBRedirServer *s, + USBRedirServerPkt *rp) +{ + struct usb_redir_interrupt_packet_header resp =3D rp->intr_hdr; + bool is_in =3D !!(rp->intr_hdr.endpoint & USB_DIR_IN); + int actual =3D rp->pkt.actual_length; + int len; + + resp.status =3D usbredir_server_status(rp->pkt.status); + + /* Only an IN transfer carries data back. */ + len =3D is_in ? actual : 0; + resp.length =3D len; + + trace_usbredir_server_intr_complete(rp->redir_id, resp.endpoint, + resp.status, actual); + + usbredirparser_send_interrupt_packet(s->parser, rp->redir_id, &resp, + len > 0 ? rp->data : NULL, + len); + usbredirparser_do_write(s->parser); +} + /* * USB port ops */ @@ -452,6 +498,12 @@ static void usbredir_server_packet_complete(USBPort *p= ort, USBPacket *p) case USBREDIR_SERVER_CTRL_STATUS: usbredir_server_ctrl_status_complete(s, rp); break; + case USBREDIR_SERVER_BULK: + usbredir_server_bulk_complete(s, rp); + break; + case USBREDIR_SERVER_INTR: + usbredir_server_intr_complete(s, rp); + break; } =20 usbredir_server_pkt_free(rp); @@ -828,6 +880,105 @@ static void usbredir_server_get_alt_setting(void *pri= v, 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; + 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; + struct usb_redir_bulk_packet_header resp; + int ep_nr =3D hdr->endpoint & 0x0f; + USBRedirServerPkt *rp; + USBEndpoint *ep; + uint32_t len; + + if (!s->host_connected || !device || !device->attached) { + 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) { + resp =3D *hdr; + resp.status =3D usb_redir_inval; + resp.length =3D 0; + resp.length_high =3D 0; + + trace_usbredir_server_bulk_too_big(id, hdr->endpoint, len); + usbredirparser_send_bulk_packet(s->parser, id, &resp, NULL, 0); + usbredirparser_do_write(s->parser); + return; + } + + ep =3D usb_ep_get(device, pid, ep_nr); + rp =3D usbredir_server_pkt_alloc(len); + 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); + usbredir_server_submit_to_device(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; + 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; + int len; + + if (!s->host_connected || !device || !device->attached) { + 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); + rp->redir_id =3D id; + rp->type =3D USBREDIR_SERVER_INTR; + 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); + usbredir_server_submit_to_device(s, rp); +} + static void usbredir_server_filter_reject(void *priv) { trace_usbredir_server_filter_reject(); @@ -851,6 +1002,24 @@ 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_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) { struct usb_redir_control_packet_header resp =3D { @@ -899,7 +1068,9 @@ static void usbredir_server_cancel_data_packet(void *p= riv, 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_SETUP: @@ -910,6 +1081,21 @@ static void usbredir_server_send_cancelled(USBRedirSe= rver *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 =3D 0; + bulk.length_high =3D 0; + usbredirparser_send_bulk_packet(s->parser, rp->redir_id, + &bulk, NULL, 0); + break; + case USBREDIR_SERVER_INTR: + 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; } @@ -952,6 +1138,8 @@ static void usbredir_server_create_parser(USBRedirServ= er *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. */ @@ -963,7 +1151,12 @@ static void usbredir_server_create_parser(USBRedirSer= ver *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 */ usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version= ); diff --git a/hw/usb/trace-events b/hw/usb/trace-events index 25219a018a..c9ab80c6ba 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -411,3 +411,8 @@ usbredir_server_ep_info(unsigned idx, uint8_t type, uin= t16_t mps, uint8_t interv 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_ctrl_setup_complete(uint64_t id, int status, int actual) "= id %" PRIu64 " status %d actual %d" usbredir_server_ctrl_status_complete(uint64_t id, int status) "id %" PRIu6= 4 " status %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_interrupt(uint64_t id, uint8_t ep, size_t len) "id %" PRIu= 64 " ep 0x%02x len %zu" +usbredir_server_intr_complete(uint64_t id, uint8_t ep, int status, int act= ual) "id %" PRIu64 " ep 0x%02x status %d actual %d" --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067874; cv=pass; d=zohomail.com; s=zohoarc; b=l6Wjc4V3ov21G0/5y7rkj0+t/qPveZlYf36yoj9u2/YhAwlvQ4psfZiZ62JzGi9rweA6vxuWBC9qjwer0FoRoryTwpTX7n0/C0ZzFr48+c7AD8dF12h3cMfD8HIm1VMq9L3t2vg4nTZQh75HNkkH3gvpi0LDLu5t7UeNuQb26tE= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067874; 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=NO9Ek8HLGUhzoIgoWNnj1AeSvZffuM8vZAlB2O5HpR8=; b=Iw3hjNMMiExUSAnEJRiayaABXzs696JxRKaqw0WFAZKV+P0/PQrzgJ+1eyQ4d6qDRVGsJrVVWseJI+NFIOagKI3Iloa4+kvsOYuLfgGhoqI77Y3soaZfPIEpEf7I4fkXngDChbeq2NcwIxcH5CzVSXs6NBRrw0WGUJJFo/wpQug= 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 1790067874920299.2304567264954; Tue, 22 Sep 2026 02:04:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOH-0007VR-Qn; Tue, 22 Sep 2026 05:02:18 -0400 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 1x8wOF-0007UK-SK; Tue, 22 Sep 2026 05:02:16 -0400 Received: from mail-japanwestazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1x8wOD-0002C2-62; Tue, 22 Sep 2026 05:02:15 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02:05 +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.0428.015; Tue, 22 Sep 2026 09:02:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=F8lP9yM7tT5DtRqrNhx/Q2YqsYX0bl72I+xb/yHedkqyrtawgAVgqFd9O6kpbRvj22ySGsiVxpK8HcpNMCtYMeZdrFSVuawNamc7+vT+TpgC3aM49sjh8xMsuqN/6QkaGjOSesasTbykwlbocxCwyoG85ujK39FoUjsgVqb7+MoaOjpbQkI4ZTov0G3IQeYgULR99RA3h2b7zLBpj0An3zAVIUZ7EaQXnoJ8SjFOPV84812QdCpmGp9PULSf920+sSbHyPlvqVvDOpAg55waqc00lB5CGdehtFaULRukCKie5PyI8uXlyE/mXwoN6qsSrRXF5etPQ+mEmo1qtj4NDQ== 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=NO9Ek8HLGUhzoIgoWNnj1AeSvZffuM8vZAlB2O5HpR8=; b=Flf6m5pqQk0d9dsBvYN67prsO2MKwzo+NhlJdS/+h4HAwAnSCKJR26IdrNfOsALNiKTI/edw8i3hT48g4nXvQwF0l2ippEKWkbuAaN9qAqSYupuwWTxBg4ssIdHiuWozdv7eooIIFn99F3BnGd/u29lTjc5oafayzSz1o91E5+MyRedmvZx9wxTHRdv7tNRHUOqDj9v5ISrCpgFLEGjRJ8Qxzjh/zQdOWolkBb+D/3ZyjZOOC2Mj2I8ZbiDzSfrYIsPisOLblB41kMufVBhxlhkWYtgzO1lR58gTXgPrf1bawR53gxWcrfpeXHbHmOzRuu0rvlync3UY8f+IDLJV1A== 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=NO9Ek8HLGUhzoIgoWNnj1AeSvZffuM8vZAlB2O5HpR8=; b=HCyob6i3Vzf2nZ+xA4LGMVCr6Qq9vr3L/1pVFhoDKb7dZlS1O8TyYV1DjbSGU7C+B1Aq3+xcDZveG5ob1elcO/4fvEl43OGv7p9ih/ggHBV6CAKcv6MyfL4RSXbv0pRa7XYCi1ibcto9gniaLfMHgDMdhhRXABHwe+037ggkz/O58p+zD9QdswJJuCYR5Ldx+mu5dWFeebSJMCi8wa6rl5jDOIw9B9SwUBHnJ/pL2/EDNnHjiUbtkoVMRd0G8KtAj84sznw7FncMJDq0/GQWZXtsFsZmvpV/w9zUjcW3ne+y6lbMAiC99jrMjcocyWJ6Ba4/fNI9tjv3MBY6Ukn13w== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 07/19] hw/usb/redirect-server: Stream interrupt IN endpoints Thread-Topic: [PATCH v1 07/19] hw/usb/redirect-server: Stream interrupt IN endpoints Thread-Index: AQHdSnEJ3wDEIzLYO02sbpSY02zhHw== Date: Tue, 22 Sep 2026 09:02:04 +0000 Message-ID: <20260922090154.1792077-8-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: 3d06b745-8db2-4bca-b7d5-08df18882c44 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|5023799004|56012099006|10067099003; x-microsoft-antispam-message-info: txHXV01j15cmiFq5BENZdMzWbK9IY68UfhsvVehKbvIRVPwQGvNCJ3sGGdFoNP3t6U1muRR+oV/8xIfhpPR0jO1UBMK6nCgEw1zfWTiCHMdnn+fzeqOOl7RkTlrHJubay/0oZkhvCuE1ND/u9DIuwxzmL45QJVqK9O9ogkYGBmM4sJ4dsMijeTUo+uV8+jblFIrHtxWL2VteOmdw2iHemWy8jq2v+OkZzWnys2fUH59343ZJWDD6LDQF/fK19Wp6OEVsowGlXzzUS0bfqjtKNlN/W7i3iPBprIPOxKfMPVd4atmCjoG5RltSlJ52m1qdbJfeo23Qixc9a+4rTn16hpb/F6lyDoUs1Fg+Iva6qZ50CW9z693NMzB+c/q0O94sMOTmUifmGmi3kfXla5e75oDA8ULE/G1XgTRFOuc1dWetnyDlXMeFibac8zmF6yIb8xVPXjYpvSZVVdtomHS06qA8+3GgAWcXzJWgcBIUQuKV6WBQeGdDMjl2bIDKybMoMgT3prT42s/ODsArLMBqd9CJSKotr8oey32mxHRtnXNcTjysyS4L3JK6o/re6q3Mza6DjBtuW9UC9IKAreMQVTXL5yz2CBc33sXjBwIhdkMqeL1aYLru2XagsmZVYnmEhctlwt1qUETLeM+oy5cnF089KIOW2Lv8EhRxHDtu8j1/a6NmNSe8lnnrF2lyYk7LqzIDFku4doxIjuMc0wcN5K4Og+dmsvvdMtdXaMosK/s= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(5023799004)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?pqvx+pp+6gq+YPrdQRY8obv/2RgVXcOfKMqF2gOG2XE4iEqYF+zuns8XmV?= =?iso-8859-1?Q?IZ5js4sCMJ+Bky419C7P8FpABJDhlardCo800y1wqecXTX9/byLMUBmkrD?= =?iso-8859-1?Q?T1cDCDZ/szTAfNp0ABVlxzb2Y56/CLcAEWjSubpaUOCMcO2cKa62H8uuIq?= =?iso-8859-1?Q?9zHsQCEZ/0+8KhN8y0y47TPjdxa+HbvTx83g/1+RzKc6pMTjlLeSUpID7W?= =?iso-8859-1?Q?0qvNgchX9e7DTNpFF+/yucQOjxcXMFK9DFx4rtCbj9ONDjPZOFZCoQ3/BG?= =?iso-8859-1?Q?u7uFKygYiXQo9a42Uz+kdJ+BhXtjghzH02up4o3hFePdT9fbuPb88uOsd8?= =?iso-8859-1?Q?fDZ3ce7zeTokdtj8vzhM3e2mVNZLhYOO7AJ/duLY6pVaGJPUE4sjJm479i?= =?iso-8859-1?Q?vXxzAMDB7OPJ8cdir9saFM7FsQoKubk6nAL09zFwauCLUTdtB4gXf9MVyl?= =?iso-8859-1?Q?IO1fyAO/f4HRfNsVBhe1orwZUmBv4OX3nsWXKFTuI9FqY4rBmXPLGZejKn?= =?iso-8859-1?Q?s3c4Td8L3DYxPqIKAQlb/vsYD7pinFWDRAQth5MbMBDK4h69ePYRlXSdzR?= =?iso-8859-1?Q?DXCrHL/Uaz702Lcl267RG2c3p0raiCWnvHeuDE6jlgeqvqFgDJIQ+vj3ZA?= =?iso-8859-1?Q?w9Qgzpaqi4rdi+GPKfa/NGSywNVbqVSjGVD2ataSCpNCSwAJhHRSoxIltZ?= =?iso-8859-1?Q?UqPh7W5d0YuhEVS6zEoYjB44VmCa73p0rUv4OIWI2cJ+Oh7aow53SSum5j?= =?iso-8859-1?Q?Ugjpx9XxpBuCUI2KWBp0Xpp4qDMCOh+3IRKI5N4io6Fr4ZUvZSRxJ/OC07?= =?iso-8859-1?Q?bnQowO1OYdkGyd+NfmE+u/aypkPAkhnigIpx1i1pXm56P//4WsmRF/Z0Or?= =?iso-8859-1?Q?rWs2e2VmPZWF8IM7dd3NT8AJUISNc83DZD9hfLU8KWgFje9EigIKG1CK0G?= =?iso-8859-1?Q?QElTeInIeRzcDhD38aQTAHTh+QCEeI9htOd1SYLAoIaJlml7YgAsiJjAc2?= =?iso-8859-1?Q?F4rVmGjn2yKVa0sRIR9Q+P612A/eGDjVit9huxWJPIXBV+yquRrYO3HbU+?= =?iso-8859-1?Q?o9OGy6oco2IwWeesl3F+gzgkPd49R+ORWAM4LheiAyY/xsMp20Xj7NJoUG?= =?iso-8859-1?Q?pckZ5odprgIdU6tgozMt8WuX73g1uv2vZ6lhXrBdMIHfb+WkBVtKYIfHCX?= =?iso-8859-1?Q?BDwb0vI0bQIJhNTkFKQ5VpFAp9MJ/6NXbTD3+Be4jFelBP+yU5na/HZTnX?= =?iso-8859-1?Q?2pWRpnM6gGNGaWqW1EKa7ZBDIrCLGDnHsSpb0V0G6Hk3h0/Cx6reiDvqgr?= =?iso-8859-1?Q?wbKrLVHsr2QkEiC8zXx0UQHM6JDgZT2SUitsVRcPhbSfLerWN8V6jhEMg6?= =?iso-8859-1?Q?H82RbCC/qbJebFf39mBWdj1lk5X2E5CXAEScj9kKptMg9m45ms6QqERXgK?= =?iso-8859-1?Q?0T5foWmy1Rfxzn9u2wwMQy1I4/7A6+bOP4tw+DOS+21tMDLuh6Vo+r+jVl?= =?iso-8859-1?Q?BoHHysSODxIfY4C/m36eXA1WHnRNBKzFtfmRD8YX4WR3uNZE2WYyHLfnD6?= =?iso-8859-1?Q?Z7Ji0M/GzgmC8RSRlfIohD0wAFHv3Iba3xBDJsrLnd4AyS9+P+CcZ3+an2?= =?iso-8859-1?Q?3eCHqXu5zhNhk3HmSGkEdP2nvxusRpHzR6qGN/LZD7X1u/4gtBF4Mda9A4?= =?iso-8859-1?Q?DCGl0Bg41LSXfTnRWC9zjxmeTg4U8kf5sESs+2/rPKpuOGa0HN4W0qNgTg?= =?iso-8859-1?Q?9xk1acOVocL0kFAEmcd5XbepVlsdnzGSwu2ZHqUmyYUu7SpxVQrXlwZ/rN?= =?iso-8859-1?Q?o4Mex95NhQ=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: CsPwKZlExHdfahlEpgaReN0C3i0Ebi4jXlEc/rlvK1IUTn9WB+579KYxp+BWe7OD3RmNgaghBS35Z9F4YOmmLb/CdQmnHW565XU0PiMukS1l6aufwVL5WFeNwnT9j5r4i6gD6T7/wovXDfQghTdi5/sd7Vexrhu09/nCW0UhuVNuBMovTEgYmaCKhm3P+tESSKE/9n2f4aoiEUTQRclFrbD1e305y/VkU+J9KUdufMhEppofoHtG1TOOQqLGx6oy07KIbqMDvGIfPM5Uj9A2HS5xKnwUvQqGk1h8yr14KdoLtQkVcvVRRF3qw6dSXoKny2+9+0sLw78heQ5W/afbRg== 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: 3d06b745-8db2-4bca-b7d5-08df18882c44 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:04.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: a7bBYD0wh4bgCXcDxVxoVbwdWe1dRdbTyVGjrk5ggUkI5BCi6UTzCPO4Cobo7VBN3GXxKqcf7+87quEJvDrq9Q7iiMvfbo4O9AKBoCZxJ/E= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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:c406::3; envelope-from=jamin_lin@aspeedtech.com; helo=OS8PR02CU002.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_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: 1790067875409158500 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. Signed-off-by: Jamin Lin --- include/hw/usb/redirect-server.h | 15 ++ hw/usb/redirect-server.c | 248 +++++++++++++++++++++++++++++++ hw/usb/trace-events | 4 + 3 files changed, 267 insertions(+) diff --git a/include/hw/usb/redirect-server.h b/include/hw/usb/redirect-ser= ver.h index f7b2261db4..1fb2a8a7a4 100644 --- a/include/hw/usb/redirect-server.h +++ b/include/hw/usb/redirect-server.h @@ -28,16 +28,23 @@ OBJECT_DECLARE_SIMPLE_TYPE(USBRedirServer, USB_REDIR_SE= RVER) #define USBREDIR_SERVER_MAX_EP 32 #define USBREDIR_SERVER_EP_IN_BASE 16 =20 +/* An endpoint number is 4 bits, so 0 to 15. */ +#define USBREDIR_SERVER_MAX_EP_NR 16 + /* * 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) =20 +/* Buffer size for an interrupt IN endpoint before its descriptor is seen.= */ +#define USBREDIR_SERVER_INTR_DEFAULT_LEN 64 + #define USBREDIR_SERVER_CTRL_SETUP 0 #define USBREDIR_SERVER_CTRL_STATUS 1 #define USBREDIR_SERVER_BULK 2 #define USBREDIR_SERVER_INTR 3 +#define USBREDIR_SERVER_INTR_STREAM 4 =20 /* Which message answers the host when a control transfer ends. */ typedef enum { @@ -87,6 +94,14 @@ struct USBRedirServer { bool host_connected; bool device_announced; =20 + /* + * Interrupt IN streaming, indexed by endpoint number. intr_bh asks the + * device again; intr_retry does the same after a delay on NAK. + */ + bool intr_in_started[USBREDIR_SERVER_MAX_EP_NR]; + QEMUBH *intr_bh; + QEMUTimer *intr_retry; + /* In-flight packet tracking */ QTAILQ_HEAD(, USBRedirServerPkt) inflight; uint64_t next_id; diff --git a/hw/usb/redirect-server.c b/hw/usb/redirect-server.c index a733a007e3..f84ece02e4 100644 --- a/hw/usb/redirect-server.c +++ b/hw/usb/redirect-server.c @@ -69,6 +69,13 @@ /* Wait this long after attach before we announce the device. */ #define USBREDIR_SERVER_ANNOUNCE_DEBOUNCE_MS 10 =20 +/* + * Ask again this often after an endpoint answered NAK. Most devices wake + * the bus when data arrives, and then the next ask happens at once. This + * timer is for the devices that do not wake the bus. + */ +#define USBREDIR_SERVER_INTR_RETRY_MS 1000 + static void usbredir_server_pkt_free(USBRedirServerPkt *rp); static void usbredir_server_stop_transfers(USBRedirServer *s); static void usbredir_server_send_cancelled(USBRedirServer *s, @@ -402,6 +409,63 @@ static void usbredir_server_intr_complete(USBRedirServ= er *s, usbredirparser_do_write(s->parser); } =20 +/* + * The device answered a parked request. Send the answer to the host, then + * 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. Let the BH ask, or the retry timer after a NAK. + */ +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 ep_nr =3D resp.endpoint & 0x0f; + USBPacket *p =3D &rp->pkt; + int actual =3D p->actual_length; + bool retry =3D false; + + 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: + /* nothing to report yet; ask again shortly */ + retry =3D true; + break; + default: + /* + * The endpoint stalled or failed. There is no data to send, so + * send a status message. The host keeps that status and gives it + * to its guest. On a stall the host also ends the stream, so end + * it here too. A later request from the guest starts a new one. + */ + 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); + s->intr_in_started[ep_nr] =3D false; + break; + } + + if (s->intr_in_started[ep_nr]) { + if (retry) { + timer_mod(s->intr_retry, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + + (int64_t)USBREDIR_SERVER_INTR_RETRY_MS * SCALE_MS); + } else { + qemu_bh_schedule(s->intr_bh); + } + } +} + /* * USB port ops */ @@ -504,6 +568,9 @@ static void usbredir_server_packet_complete(USBPort *po= rt, USBPacket *p) case USBREDIR_SERVER_INTR: usbredir_server_intr_complete(s, rp); break; + case USBREDIR_SERVER_INTR_STREAM: + usbredir_server_intr_stream_complete(s, rp); + break; } =20 usbredir_server_pkt_free(rp); @@ -521,7 +588,25 @@ static USBPortOps usbredir_server_port_ops =3D { * USB bus ops */ =20 +static void usbredir_server_wakeup_ep(USBBus *bus, USBEndpoint *ep, + unsigned int stream) +{ + USBRedirServer *s =3D container_of(bus, USBRedirServer, bus); + int ep_nr =3D ep->nr; + + /* + * The device has data. A streaming interrupt IN endpoint may have + * answered NAK. Ask now instead of waiting for the retry timer. + * Every other transfer already has its request on the device. + */ + if (ep->pid =3D=3D USB_TOKEN_IN && ep_nr < USBREDIR_SERVER_MAX_EP_NR && + s->intr_in_started[ep_nr]) { + qemu_bh_schedule(s->intr_bh); + } +} + static USBBusOps usbredir_server_bus_ops =3D { + .wakeup_endpoint =3D usbredir_server_wakeup_ep, }; =20 /* @@ -572,6 +657,91 @@ static void usbredir_server_drop_pkt(USBRedirServer *s, usbredir_server_pkt_free(rp); } =20 +/* + * Interrupt IN streaming + */ + +static bool usbredir_server_intr_inflight(USBRedirServer *s, int ep_nr) +{ + USBRedirServerPkt *rp; + + QTAILQ_FOREACH(rp, &s->inflight, next) { + 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_park(USBRedirServer *s, int ep_nr) +{ + USBDevice *device =3D usbredir_server_device(s); + 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->intr_in_started[ep_nr] || + usbredir_server_intr_inflight(s, ep_nr)) { + return; + } + + len =3D s->ep_max_packet[ep_nr + USBREDIR_SERVER_EP_IN_BASE]; + if (len =3D=3D 0) { + len =3D USBREDIR_SERVER_INTR_DEFAULT_LEN; + } + ep =3D usb_ep_get(device, USB_TOKEN_IN, ep_nr); + rp =3D usbredir_server_pkt_alloc(len); + rp->type =3D USBREDIR_SERVER_INTR_STREAM; + /* streamed data carries no host id */ + 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); + + trace_usbredir_server_intr_park(ep_nr, len); + usbredir_server_submit_to_device(s, rp); +} + +/* BH and timer callback: ask again on every streaming endpoint. */ +static void usbredir_server_intr_kick(void *opaque) +{ + USBRedirServer *s =3D opaque; + int i; + + /* Endpoint 0 is the control endpoint. It never streams. */ + for (i =3D 1; i < USBREDIR_SERVER_MAX_EP_NR; i++) { + usbredir_server_intr_park(s, i); + } +} + +static void usbredir_server_intr_cancel(USBRedirServer *s, int ep_nr) +{ + USBRedirServerPkt *tmp; + USBRedirServerPkt *rp; + + QTAILQ_FOREACH_SAFE(rp, &s->inflight, next, tmp) { + if (rp->type !=3D USBREDIR_SERVER_INTR_STREAM || + (rp->intr_hdr.endpoint & 0x0f) !=3D ep_nr) { + continue; + } + usbredir_server_drop_pkt(s, rp); + } +} + /* * usbredirparser I/O and logging callbacks */ @@ -1002,6 +1172,58 @@ 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, + }; + USBRedirServer *s =3D priv; + USBDevice *device =3D usbredir_server_device(s); + int ep_nr =3D hdr->endpoint & 0x0f; + + /* + * Endpoint 0 is control and an OUT endpoint never streams. There also + * has to be a host to send to and a device to ask. + */ + if (ep_nr =3D=3D 0 || !(hdr->endpoint & USB_DIR_IN) || + !s->host_connected || !device || !device->attached) { + st.status =3D usb_redir_ioerror; + } else { + s->intr_in_started[ep_nr] =3D true; + } + + trace_usbredir_server_intr_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_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 ep_nr =3D hdr->endpoint & 0x0f; + USBRedirServer *s =3D priv; + + /* Endpoint 0 is control, and an OUT endpoint never streams. */ + if (ep_nr =3D=3D 0 || !(hdr->endpoint & USB_DIR_IN)) { + return; + } + + trace_usbredir_server_intr_stop(hdr->endpoint); + s->intr_in_started[ep_nr] =3D false; + usbredir_server_intr_cancel(s, ep_nr); +} + static void usbredir_server_alloc_bulk_streams(void *priv, uint64_t id, struct usb_redir_alloc_bulk_streams_header *hdr) { @@ -1106,6 +1328,14 @@ static void usbredir_server_stop_transfers(USBRedirS= erver *s) { USBRedirServerPkt *rp; =20 + memset(s->intr_in_started, 0, sizeof(s->intr_in_started)); + if (s->intr_bh) { + qemu_bh_cancel(s->intr_bh); + } + if (s->intr_retry) { + timer_del(s->intr_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. @@ -1151,6 +1381,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 @@ -1292,6 +1526,10 @@ static void usbredir_server_realize(DeviceState *dev= , Error **errp) =20 s->announce_timer =3D timer_new_ms(QEMU_CLOCK_VIRTUAL, usbredir_server_do_announce, s); + s->intr_retry =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, + usbredir_server_intr_kick, s); + s->intr_bh =3D qemu_bh_new_guarded(usbredir_server_intr_kick, s, + &dev->mem_reentrancy_guard); s->chardev_close_bh =3D qemu_bh_new_guarded(usbredir_server_chardev_cl= ose_bh, s, &dev->mem_reentrancy_guar= d); =20 @@ -1311,6 +1549,16 @@ static void usbredir_server_unrealize(DeviceState *d= ev) =20 timer_free(s->announce_timer); =20 + if (s->intr_retry) { + timer_free(s->intr_retry); + s->intr_retry =3D NULL; + } + + if (s->intr_bh) { + qemu_bh_delete(s->intr_bh); + s->intr_bh =3D NULL; + } + if (s->chardev_close_bh) { qemu_bh_delete(s->chardev_close_bh); s->chardev_close_bh =3D NULL; diff --git a/hw/usb/trace-events b/hw/usb/trace-events index c9ab80c6ba..931996e8cd 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -416,3 +416,7 @@ usbredir_server_bulk_complete(uint64_t id, uint8_t ep, = int status, int actual) " usbredir_server_bulk_too_big(uint64_t id, uint8_t ep, uint32_t len) "id %"= PRIu64 " ep 0x%02x len %u" usbredir_server_interrupt(uint64_t id, uint8_t ep, size_t len) "id %" PRIu= 64 " ep 0x%02x len %zu" usbredir_server_intr_complete(uint64_t id, uint8_t ep, int status, int act= ual) "id %" PRIu64 " ep 0x%02x status %d actual %d" +usbredir_server_intr_start(uint8_t ep, int status) "start_interrupt_receiv= ing ep 0x%02x -> status %d" +usbredir_server_intr_stop(uint8_t ep) "stop_interrupt_receiving ep 0x%02x" +usbredir_server_intr_park(unsigned ep_nr, int len) "parked IN packet 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.53.0 From nobody Sat Sep 26 20:00:47 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=1790067808; cv=pass; d=zohomail.com; s=zohoarc; b=Ssy5lZO5KvGXasKiqoTHxEoat9EZvmSlVj4JDwV7IpjmbkOau964FQ+vk1s3h8SSVOPUw3wgGahEbsew7B5Nb5EjJ/3CGYe/vnJ35SHBDslsTLENN8Ythc3nckogKfk/8KEx+my6yklKfF2L6nT7eKA48lxgOCGo1LpcTdRrNT8= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067808; 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=AXyPsUOF6Dr+ybSUviulLSM6KRHCdPuRSxJcpIt14jE=; b=knyOZF4KsgQwplVqyGWKxdHdqEnfDv4q5PgajVkF/LO+Y8TrknCNOrtC8aCZlq5vQ1oSuFmJciqna9itSdGoV3yYRretoy5ysnoEbO4pW0GIBqRcWigxud3TkBx7RPp9jE1HkBxItk3G6W3GpPs04Q7mE134vUBl77z87gNOba0= 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 1790067808282828.2651372608846; Tue, 22 Sep 2026 02:03:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOL-0007X8-JR; Tue, 22 Sep 2026 05:02:21 -0400 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 1x8wOI-0007Vj-Aj; Tue, 22 Sep 2026 05:02:18 -0400 Received: from mail-japanwestazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1x8wOG-0002C2-MQ; Tue, 22 Sep 2026 05:02:17 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02:07 +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.0428.015; Tue, 22 Sep 2026 09:02:05 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qWgl/UEP5fAt5guEOeFwyrpSG5R3Zvk8ZgKhs17wGIWEzw9xLCHdQNUW8+RE6qcQ3gieaGfpx/DosJqylbTbzICwcoNTGsuKZktCdX0Zvl03njSjVQZ/76sziilMYfI9fYIcmq7mkp3yIGT4YO5Y6OfHSE4PpOiy5Ht5rUQGMj9abYYApidqfPNT5Vunep8Vvk5nELYYWKVpOT2OZ8rud+ObdMIaHb/XM7nmynO2wf7V7kYt0H0Adr5GRewI+elZr//sC0pRoKJsbm2oLqfMbM2naBKbrWzG/7dT/rw94ujfRYj8hCi5EvF6qv0VNcJS/fhrdutEc9wZMQbhsfl4fQ== 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=AXyPsUOF6Dr+ybSUviulLSM6KRHCdPuRSxJcpIt14jE=; b=fYyMs4dIPkfTwBRJSmOd8XZmFow0fgi3z5VqyIoIeGEAefhiwO+61miD4jib4spQOnIt2bNpmTL5r/AdxZFikw1iOBng7Ol87ItpSDGJ/hoRfF2CcJhOR/r4ETlYR578ZWSUUgsoxIb22Ew941UiD3CTKY1V3L+S/Ga1UFlL31fxJwZBjzP+tKk4oTmzx6M77paRyAmFjhGH273ZKF+QGIsD+pFRYhRtjRZ9SLqt/2EZ/rDWpDk3zgbwnMfZCvGdOVfb2fiJk4RgqnOTRzd3GXOwt/S85qsbl5lyUUZ9H5Tr7aJUbeb9gajHkva6W0SY+o965Nd5irJX73sq7iOPQA== 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=AXyPsUOF6Dr+ybSUviulLSM6KRHCdPuRSxJcpIt14jE=; b=OYVdvmCAH5XDZxcw2Khv3DsPo23o1yUOyfZYOJcRQhBcuiJgFUTYnsbJOp9xU7HBRP+w+aJIKU/bYFgSL4da+JmUq0ZouzI18lRwzs8E8/QB96O3MtMD9c0jNMbr0dKuTipJy08Zel7uD9TVt8VHrK4RcF1haJcsapmsDuLOhoj7BgNeKC5oM0ucZ4VMZ+1CTWndPs7Giy+tSLxZV7nQJVA1cGreMwQ7M7s20iS2iJUe/4uWevqAxPBYZtYZI6Axhch46yrXFGv4o5cT/m0el/Kxv+yk/QLnr673hmrKpyvhh+Phrbfy9hOgFM936QOi2QgRTsQsnR3bC1Q6fB3jBA== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 08/19] hw/arm/aspeed: Enable the usbredir server transport Thread-Topic: [PATCH v1 08/19] hw/arm/aspeed: Enable the usbredir server transport Thread-Index: AQHdSnEKLOWK1Z9CFUKdFkSODpKLfw== Date: Tue, 22 Sep 2026 09:02:05 +0000 Message-ID: <20260922090154.1792077-9-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: d860094c-4dc4-4cb7-1de2-08df18882cf1 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|56012099006|10067099003; x-microsoft-antispam-message-info: AF+7koHwrCST55xYUU3/vcFKddkIsxviRYWClygP7yYFOuGHbmGJlI86SnkmaBPlf+2xGM6L90XPK8izbRytSyAxj966ga5FJXvXCGhzXkvHwshcFsk+fhh9CQhOOiUsb4BFTtTDh7oa5xZQhOIOA7ZLMuv6WpzSNsHcA5j7KVShVhUtz8tYkaep3KT8dwm34tw1lG9s7MwlPlFwO7Jx7oCT3qFZ0HsbdQFf46vhThpFJlUbfmbge1q6kWOWyY8OKmLgqJtjINl2aMxXC5Qh0TM6q/jA/jrcR/0cqZ496SvPXx/JFxMs9NRVFgxj+5es3a+CyKmEUCNOYsKnUhqAAXcbvIbRgaQJddrKgfM8IEIwfnCNHTg7SmN9Yh/rUVQJiS7FNezGEzQrQeLyjEAkRl7yZ8qAxmecZDokRaYIGRzbVngAkzOIm7/F/0GLy/ZgcOTUZqbnNfmFVU5vyLcz3IrphxQX3xyRmDti2SUIEl084by6ha5fL39z8KytWutgU+wQ0s4GhLCSR79S/XZlBYWrWnkbDXfZ9SMc4WN7JIq2N8m5+89a8TzG13gQbQDMqcrG55Ku2hP/dHMRutsbwGj5ZCKpfTbwnmk62Mm55pUbJhRVMJG88sfQ+qDhdG/+O3MVY7UJ3glh62zF7oq90o3sVQVIbP6RqnnZ2vMCkPuYDH+3FSW4uHnKGNlSpKDLggLHkWsnhMRlUd5L9POlfBxZo/EcAvIBaGYx54qDj9w= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?R5NoyqrxhD8WpaQFk3udI3qj0EG3xH9wykk07YXtDfyBdHDoRk+My7+h/F?= =?iso-8859-1?Q?KOdE4BimhHi0mrPr8amqBYc5glo2qpkcBPSB/KbW7Pa4wRYPrMFsXVKB9S?= =?iso-8859-1?Q?9kLhWfQxaIBr98m8uhlz/Fh8k0dAwKzwym9rTmDED7MjsTD3T+wuWEM7rQ?= =?iso-8859-1?Q?XXHRDnU8IwBJJYrVHf0hpPWpgisSPaGzHTBN8wUFA1S+b0A03Wm0Hey/jw?= =?iso-8859-1?Q?mq2+GvxamVpD2uWugYSBPloHZ+Tizf+aYd68XCdg14wi32/rNSPEhjb5nL?= =?iso-8859-1?Q?6tdQWjtGL+ZzI/roq26DNQcN9Ni1u2WX+GppFOO3fS8AIYoJ96Jh8+a1Zt?= =?iso-8859-1?Q?tib/43Vw/+lJf3lVULITY0QfNLYESkUDI4BQmEldrHcFfZ9uciYh4Ttv7N?= =?iso-8859-1?Q?72kuk+jSuVdORP73ClQaOIUrNUAIXhUUdXOJ5W508yw1d7xCSUv88/+tDR?= =?iso-8859-1?Q?+GqtS/MWnx0QJvKDiFIGfFpqppooTtptknBBcc7oL0INgOZaNLwQD926kg?= =?iso-8859-1?Q?qIHTHsMqrV0dSCE3bWmQPEwhKyjaN+hW0XwO3XS9RRUh+ge+OnokE5+IOZ?= =?iso-8859-1?Q?3fhPcTxgPJ44TO68ACI/bnJwFtSNT104WXA40uz9v2ll379aMVDAeeFq/6?= =?iso-8859-1?Q?J0y6WnVK2yOw4gFCjaUp1JP9uzDBcu5PiolXlnpjcJcKLv4CUE04GoWyv/?= =?iso-8859-1?Q?xMsDUVlOevS13Vf1JISPEdjppZYcbNKQISV29k+AkpLqO9TXBkt60FiN3X?= =?iso-8859-1?Q?MMDJklQZKR7WS2eFpt5FmFkJf/P368glG+cSgzsIrzl7vicAbvV67MT5CX?= =?iso-8859-1?Q?VqMJNsNjS28djSoMnLQylEqzBXrBCEpSfwSa3L/wmaKRqr2WFO3HyiRyWG?= =?iso-8859-1?Q?gKFM40BaOL/rrJ0teGpuUCTglkoa5wWx5/VtlVn8dESsTzhwzjoDs4BITe?= =?iso-8859-1?Q?ZBfFeUOaFC3pmbdqhFj851ckUGKw6pHJ8mWys/ajvIEHZAKXts/5yxYZUe?= =?iso-8859-1?Q?zn/FCWxcfvaXY7gB6qSZ/E9qF/7Ayb8nFOyNYqQbxs2kwhLxLjuwj8zclT?= =?iso-8859-1?Q?bIeyPgBPFgKXVCdc+p/NVcBZfrcWAJT5wBDJKf1cN2toZqhTut1VwwMbZm?= =?iso-8859-1?Q?vXDynLfu/SDuRheyu6naIsuWNaCMGVoxSj279g9ncXRD3mTlYcyp9+uGta?= =?iso-8859-1?Q?2syviY8bo5VGvbkBU6BS8ppFTOsrKICtUjB8PwGaRovaxJA/mHBokD4JMB?= =?iso-8859-1?Q?3tcdvR1vDpuWghzb2Ku9JBxM3WZtjxD08nhvM+cpbgBX0/AUxDXUvkzwP+?= =?iso-8859-1?Q?JUVpOSoFsUvKClXILvawZSW9BNgd341rCJCDXsBJbtMUiUGsUbwFYRhj0J?= =?iso-8859-1?Q?2ocgRWZRMohLnZNaCsK5JiBwXPgBnqR0yKcGnexvw3YqAdHnV5IDMHDMg/?= =?iso-8859-1?Q?bI8gK/ZOjf1mWm4Xd2iCwQWVVM0V2aJ9fFK1vokJlw6Ms2skXuf2BYEr7r?= =?iso-8859-1?Q?szVTh/xt9vRTx6MHccmne/gLf4qKRPeCKheu0fnZVCfYSusuWrfWTSGfSQ?= =?iso-8859-1?Q?S8m9tFY8qCBKL47Wibb6zQ7YgWsjV79wZL1MIIBWWT8GWSYpcgt0As1kXB?= =?iso-8859-1?Q?O68SUYKpIsLjIDbP4pJ1/2Y4EWNNAOtMglZxnuTB2y8ZwBvlPCjWXs5ocE?= =?iso-8859-1?Q?SN6HSMEOlPCkAjNYD8TFXS2iAFqzeM59JURowaPCB/OBOfMgH/d5Nk+kHs?= =?iso-8859-1?Q?RAEhIJ7zCIhrZ5SXXuiSbxXJJzk3vv7OQM0LJ4BrTETd/boUhFl5Jrmx95?= =?iso-8859-1?Q?3OR+ZIaVKg=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: cSnnqYH/soSgrKrNz01YjbMfQm0pFQBGvVLd2obWlBpObthdP2ETk+tvhzcsLkegqrSfGK1zZAzE5DS8H2EHnR0F1ZDELbFVPO5GXlXJRTfUaLl/1WyRiSyRtznS6NNNJy5X1Y+ZniZ4LvU+GDj7Xo8nnVJH/nzQpw50WdYclSiaiP05CGs7s4gQIZEj3vH3jlrzkICVYhnfRaUyvUpWA2hc/vY2BiNBLnp1Qk/tnCyrHn0P+FetNfSDdCb6GjSe0CPlLmBLCxvOvIeWzWqLvWbYruajh94efpwLXi3LN193TOiO3uijqymYTUj6moB3y/KQ+bRlOVsyhEBnfWm6ag== 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: d860094c-4dc4-4cb7-1de2-08df18882cf1 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:05.7873 (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: edg9scGaE4F3apuNIzEUhHj3Bn3wBqz2zNmL2IPBWPndjFJLwWW/VQ3owJ6YAc5c0BJsP0zBE2Gu2XoDpmb0jUdCp6v21ueJlDVZEtsUIJU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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:c406::3; envelope-from=jamin_lin@aspeedtech.com; helo=OS8PR02CU002.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_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: 1790067811447158500 Content-Type: text/plain; charset="utf-8" Let the ASPEED machines accept "usb-redir-server" with -device, so a UDC gadget can be exported to a USB host running in another QEMU: -device usb-redir-server,id=3Dredirsrv,chardev=3D -device aspeed.udc-gadget,bus=3Dredirsrv.0,udc=3D/machine/soc/udc 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 --- hw/arm/aspeed.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c index a7cfbd6c5e..4e1ecbabe7 100644 --- a/hw/arm/aspeed.c +++ b/hw/arm/aspeed.c @@ -409,6 +409,12 @@ 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, "usb-redir-server"); amc->macs_mask =3D ASPEED_MAC0_ON; amc->uart_default =3D ASPEED_DEV_UART5; =20 --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067896; cv=pass; d=zohomail.com; s=zohoarc; b=KRnp159R3Qd+YU3Mpr1xg8SVNbxFfLAnlDAIWe1bkOpYLglkqW62eS4TLze3h+yhbua9DfRLXw0uk88zj9TKPIZC8hE+cD4jLDcZGWMzpMJ9zJlRqDdLsEFyO8ZYYHdDciK9MRe2oWZ0V6L/WwvEUdthPJxpeO6/bnhYzFd72zY= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067896; 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=B/DyTS5/JKw+xQV7CCDkIIv4AtiOvdTt4yVykDmLTss=; b=Gr75EcJHLIDO2NcFuh4yBlLTg8e65a8FhHkXOwAobBh7jzydQ4mv/fjxnluohOM0Tub0NVv04Q+JvmdSOCabiT2g2CuekGbH6aASGQKHC96hcaeMbakDcMTeeb/AGnMf/hJ7/l14uaPIdWvUU9H33ZKIkocPcKN+0pyNIs529pY= 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 1790067896098611.5883305222569; Tue, 22 Sep 2026 02:04:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOP-0007aE-Re; Tue, 22 Sep 2026 05:02:25 -0400 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 1x8wOK-0007Wx-UH; Tue, 22 Sep 2026 05:02:20 -0400 Received: from mail-japanwestazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1x8wOJ-0002C2-4E; Tue, 22 Sep 2026 05:02:20 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02: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.0428.015; Tue, 22 Sep 2026 09:02:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wP9YFLsZCPZUsvU5o3kbz/657oHPDQ+Gin95n2aRRrn2YA0yP+gXzYzRoR6tDIyMunXtnL/aWrhMsk6XPscU0D/GuvtbfBqxYaTXkcBvcf9Ab4F82WDBgORIidHhkV7n2NiY6ORNJoNBj1JkOeY8RLNsQIMW6YnuTxYz2Ff74e5j5tHlxBto8Zm2W83RU8YeNn/PT4w9A+pXwuxxeaF62J3uSudrBUwyvRLILsixsntXAXsW5A8grO3hapwzhxfpXdHim+VJmmHCDxKQVjF+IsQx8qkS9jRl+cHtNv4XK7O5RBOnqgxoyC9aGEeUOMF+4MOXVQJYrgqD1sg1gqC2Pg== 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=B/DyTS5/JKw+xQV7CCDkIIv4AtiOvdTt4yVykDmLTss=; b=d58ojQQJxuHieSJMujeNG6XoXpgBrC4TrWAPIgkupIUc35wa/ssGeETWWh/q7SBh0VU0KANJLWMK70ct2Nq2EwPimux0/AOUHaYBIXQeSSjAmUs7aSknDIf3PdJMVXp1xU2EaraTLvbUgG92P0/RDXvokWrsUepXCQZi700N38RvoXCqK19BMjRzZgi8iM3UuSIxyibxDSKC7YS707wRJXx+5zLH+n+dYYc8qnltWiRswd9kF4Y9VhtmkJORmGxzK+Wxf0kkRVR13T5hlXFStiS8lzQDbVPYbPWCegO0onLt1AAeafEOk1aKUubT1nPt3s0KBYLbht/Q45f19uDcng== 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=B/DyTS5/JKw+xQV7CCDkIIv4AtiOvdTt4yVykDmLTss=; b=beCTBIQOqE+mZu/hi/rsDA90uTKUgz9aCyhJJTi0crOGs91aReaT9+fPurGBFc6I2iR1AGbu8WUclUu4enZugbATdLrTmFNWcgU9VkRJkv3DqMuVszwqKumvRxIDpcqGOYOo1dGe1ZduAQOnaNSmb0e8ItlvBcIaU+F/x9Cad+kcRDKblHtUaH7VLjnoN2XTnqK6TGNgDxNnAb9l88uKlupo8002gc5iQYWFmZscmCbXXzTvzJYiTo/V9sh6gYVtrHS5Ivk+S6PsCLELCDg7QppQN7Fi9jCOctCODAAwtIYsn6wSxyG63sNznxV1aoNuc+iTZiVp0Dl7heWU/iAJGQ== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 09/19] hw/usb/aspeed-udc: Make the SETUP buffer byte addressable Thread-Topic: [PATCH v1 09/19] hw/usb/aspeed-udc: Make the SETUP buffer byte addressable Thread-Index: AQHdSnELXlxFHAG1XkS4jUtxHj0vUQ== Date: Tue, 22 Sep 2026 09:02:06 +0000 Message-ID: <20260922090154.1792077-10-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: e082d361-81cc-4aa7-c11f-08df18882e36 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|56012099006|10067099003; x-microsoft-antispam-message-info: 7cz09LTWWcCICvoj7l6AyypfoYMOYbsn5GfIiXxGhmR/KR38xSsE7IYUsuUspz0oDjQ14NTB3Ta+dIQLlAWAP35wrztg7iZ0hJhNdMCh2FL+cxhJbPHACCeIRfx3a/vuPU24d8Sl7+XyTNsDBChvhXRjP0NJOsBo2qKPjxjcAtVofqqOsCzEUba8zrj2U25s6WDGx4PSE4jtjvBbZffgQTrr0RsBscmL7ZMeomKV3Uf4yY71N6dPw61iExs6a7UXt6ASd5Vp2e34m8QdLlFh5qO2e6H4ewZ6m8VglErAZqIE01ShC8Rr10Bh7jlj/XEto1+O6d0gXOyBNLiDKYPdgYLGQfIo6p5dk0jpK5Rw4U7mM+H610k19keWheAiyopcIHAmY0NN3wmnOVDhbo8rOX6ZIn/6JH998JC4AL//o26KSRulWdS04JBcmzqSWTirPJ+A+/LsKUQAMa3R8yOnPc0aG5/EVAQigtm0aYcdrFz+i+79mbORBGrvjw5VQ7tDHrcDwRn3mw+xd8KuatxEuq0CH3qoslbsN2XjpFGg7jBSf1ErtG+sQO7V7Bu+UUBTC9kKfdUY7yXEiBGFAtmCy/o0yQYqlAVvJ5/U8/HbP5sOALFa4UJb69X/NXJaFcl9+qoYfgz58S1g7Znuhkb9ei76aOqZmN+nY9pOptKN3zQtVgQWFQPN2q2cIrrZ+N1/ZvoREUOc9XAb1SQFWn6pdFn40zy8CAtM7V8Qvin6M7M= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?u7RMzw5Tpcsz3ONQBqcwVhdv+dgz6YEC7qke1UcBjV/oclU5Jjhedv+8jB?= =?iso-8859-1?Q?yIyr6yY5sL9UB6imWHa+a2C3hiUri2/pGlLjnY0hAzenVRTfkVTT+Np6vK?= =?iso-8859-1?Q?SlCtg1DMgdaFHKCFerP3735id9mlVnxbcb1rF2h8v8uWxsfDf1uLmX2NNH?= =?iso-8859-1?Q?B64GsAp1Tbb5xIRcMpifgVuLlgfJnLta2F/UON6FQ+vqFCsLCk0PlRH1oj?= =?iso-8859-1?Q?tOKrLoXBNLWV8YMyqpvBwG4TNr4JSmpzZyvna1ugLEDPPu4/hgir0UJC5O?= =?iso-8859-1?Q?tgmsdUcXBWr+mCoHXHxaCbEzQUx9fgAad2muckNLX1i+putlC84hCpYdNG?= =?iso-8859-1?Q?4BqCKmFr7CCBTMSydFg2gMW9CbCJEOHZYV8RUp21tOQcWj5e1kcxW1Ina9?= =?iso-8859-1?Q?3lpl3YWS+EEhfZHzrP1w8oIMwDpnm6JiSIK9AQYGyOCzj5t93GuBGwaXXS?= =?iso-8859-1?Q?Ql/0HFF42tiNQm8+s+YxQWjwDjItN/AJyiX8bqFZdqohtsMagGBtfV2h19?= =?iso-8859-1?Q?twFaoKVqFPqf+A2eg4cE7kJQ1famCOjd1cy3ulmSFVhIhMohttax4vGpa/?= =?iso-8859-1?Q?0G3X83ExGwE0K4DHSYHdmhj/HeGdQmLdoQcc/DumVKV3NLYeV15Kq2nl3R?= =?iso-8859-1?Q?sNnSSMwKl/zw2fyMBW0njJ2SHkMsIhBfbNI05BvVwU6Ezve8GIt62G6zPS?= =?iso-8859-1?Q?LiM1ZJitF7ZrVlqVGOa7tuFW++rQxNyI3FUmO+f7Gcja0Pucm2L5vsAecw?= =?iso-8859-1?Q?9WeJ6JinSxAd28/CiVLOXAkWZK7k5atdXFS3dFcwbFzT/A3RawEKi8Ha/Y?= =?iso-8859-1?Q?eQWPS9acVgzJvEp2AKv8SIuB9nkwuKvayOk1jAtdBoHB0WhBhZrWCUes+B?= =?iso-8859-1?Q?21MW2b9X3kKdawzyFhAfPm2PCVlPHe40PU3X25z4w4g8gluVRGdM0c11Kz?= =?iso-8859-1?Q?4anmjm1A2wMOpK2dTpZ78CUhy7HNDzdQj8IVUKFJXZC6e3kXc1JIoK5PiC?= =?iso-8859-1?Q?7Esfh14gKgzRT5KtKwaVvz0AFplEqyH6tgLgdLBF60PmxrRsp+ts2gVK5Q?= =?iso-8859-1?Q?R7ibNN/MrWRLWbQ7zUer76BDfmYosq+TfigvK3wUDNyqWtDrWp50QpPm02?= =?iso-8859-1?Q?pehnBgpvsMOTjvfZh9Rb67m5pu5TfoFr7X3zaDlBJF2SBV+uQF9QjEiMYt?= =?iso-8859-1?Q?T08b0QlcRVUY65ZFmumaVqr+pae0L2BZfMYjiV7ua/iApEIpCTz898bQXn?= =?iso-8859-1?Q?jrN3OLT/777kiigghmorZvOfIeiciwBtaA+qnhey2eyiKR+GmYrYhVyNH2?= =?iso-8859-1?Q?kW0Sy6vfOp5XuibCDWIrdASEofwFnUZhSpkO3aCd7CWsBASARP3EVDYf4m?= =?iso-8859-1?Q?TvfKbbNnYtTLB0JbOBiNCfY3N8vgGr6Tn6Uvy+KQL5aGHX6mtdKVuAUyFh?= =?iso-8859-1?Q?tnSutdLszoJa/t8GVKdK45a24k5pMVvs6xhGEKtmYyObjrhmNwvBA2xKu0?= =?iso-8859-1?Q?uSECANh8x8Z2uWdAO1+l9VmxAW7XmYHUI6JENlS96CxeK6iDEbEEKenj46?= =?iso-8859-1?Q?XnEOX+PClOGBIR8nyOWqrXAZQTvr/t1yu/00ASzLankL5xfeuXZCg8QXL8?= =?iso-8859-1?Q?sdoQ4tvnK2BB5TqDHGrDHoQABIBgCSrCpzTt3L01+kkbOdO8e7S5PG1Ezi?= =?iso-8859-1?Q?PRiKsHKwnEjilamf3j25tRqTplJp9mOnAmwotPbbamA/FLMt1EEehzkzDc?= =?iso-8859-1?Q?1wkFh9jl7VbWiJAvIRtpb3g+zjvcvd9e6UTXNJhae81np1Sy1lBYtu69/U?= =?iso-8859-1?Q?6Ff7I+CKaQ=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: QBHCllOxu7tQ/Rmw9nYJU9SNs3iv6KM3oLFIb9G4iSACP5OI/YdbtdVjVogqDdAYIr1/uVNs/OadeaxP93PGYClYVQiKyKfmCTVuycg/4RHjl7eSkq7F8aPRcfmSFcLS8xrHJrCyB7fH0f9hW6cChcZOaOrJoyhG4nxuu78TzUift7hWVEYDTJLeexjyXwTUO6u3i4oTvXLM2zB2uKbVgsfB5CggchX8g/5qvgEKfTQqd0jniJcy+Rnl9LXExdJgYg7bFmGLYwhrboBwQnNrNaL7kYED+qtnk7oQaaum3OmmcpOoARQK9D3U01FpDBrlb5ZKrhA6/2Wl4NTKFgyjwQ== 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: e082d361-81cc-4aa7-c11f-08df18882e36 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:06.9396 (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: 5xzznDonio7rFnSPVXcBnNBmZK4sXKTLn/xyEDDpWEQa8w+OJPFSjD+7aZ9V+2FL2WUV4Oc55Iub5crDamVPZCoObxjs5qWw3XpVZJsduM4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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:c406::3; envelope-from=jamin_lin@aspeedtech.com; helo=OS8PR02CU002.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_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: 1790067897721158500 Content-Type: text/plain; charset="utf-8" The controller registers need a 4 byte access, but the 8 bytes at 0x80 are not registers. They are a SRAM buffer holding the EP0 SETUP packet. A read or a write that is not 4 bytes returned the wrong data, so the driver saw a broken SETUP packet. Introduce a separate SETUP MMIO region that handles 1, 2 and 4 byte reads and writes. Signed-off-by: Jamin Lin --- include/hw/usb/aspeed-udc.h | 11 ++++++-- hw/usb/aspeed-udc.c | 56 +++++++++++++++++++++++++++++++++---- hw/usb/trace-events | 2 ++ 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/include/hw/usb/aspeed-udc.h b/include/hw/usb/aspeed-udc.h index 7701c1aa34..42916c0bd6 100644 --- a/include/hw/usb/aspeed-udc.h +++ b/include/hw/usb/aspeed-udc.h @@ -24,11 +24,14 @@ OBJECT_DECLARE_SIMPLE_TYPE(AspeedUDCState, ASPEED_UDC) OBJECT_DECLARE_SIMPLE_TYPE(AspeedUDCGadget, ASPEED_UDC_GADGET) =20 /* - * Register map: root/global block at 0x000 - 0x087, then one 0x10 byte ba= nk - * per programmable endpoint from 0x200. + * Register map: root/global block at 0x000 - 0x07f, the SETUP buffer at + * 0x080 - 0x087, then one 0x10 byte bank per programmable endpoint from + * 0x200. */ #define ASPEED_UDC_MEM_SIZE 0x300 -#define ASPEED_UDC_ROOT_NR_REGS (0x88 >> 2) +#define ASPEED_UDC_ROOT_NR_REGS (0x80 >> 2) +#define ASPEED_UDC_SETUP_BASE 0x80 +#define ASPEED_UDC_SETUP_SIZE 0x08 #define ASPEED_UDC_EP_REG_BASE 0x200 #define ASPEED_UDC_EP_NR_REGS (0x10 >> 2) =20 @@ -62,9 +65,11 @@ struct AspeedUDCState { =20 MemoryRegion udc_container; MemoryRegion root_mr; + MemoryRegion setup_mr; MemoryRegion *dram_mr; AddressSpace dram_as; uint32_t regs[ASPEED_UDC_ROOT_NR_REGS]; + uint8_t setup_buf[ASPEED_UDC_SETUP_SIZE]; AspeedUDCEP ep[ASPEED_UDC_NUM_EP]; qemu_irq irq; =20 diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index 4c90b4f4c2..355512822b 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -58,9 +58,6 @@ REG32(UDC_EP0_CTRL, 0x30) FIELD(UDC_EP0_CTRL, STALL, 0, 1) REG32(UDC_EP0_DATA_BUFF, 0x34) FIELD(UDC_EP0_DATA_BUFF, BASE_ADDR, 0, 31) -/* EP0 SETUP packet buffer: SETUP0 =3D bytes 0...3, SETUP1 =3D bytes 4...7= */ -REG32(UDC_SETUP0, 0x80) -REG32(UDC_SETUP1, 0x84) =20 /* Per programmable-endpoint registers (offset from the EP register base) = */ REG32(EP_CONFIG, 0x00) @@ -363,6 +360,45 @@ static const MemoryRegionOps aspeed_udc_ops =3D { }, }; =20 +static uint64_t aspeed_udc_setup_read(void *opaque, hwaddr offset, + unsigned size) +{ + AspeedUDCState *s =3D ASPEED_UDC(opaque); + uint64_t value =3D 0; + int i; + + for (i =3D 0; i < size; i++) { + value |=3D (uint64_t)s->setup_buf[offset + i] << (8 * i); + } + + trace_aspeed_udc_setup_read(offset, size, value); + + return value; +} + +static void aspeed_udc_setup_write(void *opaque, hwaddr offset, + uint64_t value, unsigned size) +{ + AspeedUDCState *s =3D ASPEED_UDC(opaque); + int i; + + trace_aspeed_udc_setup_write(offset, size, value); + + for (i =3D 0; i < size; i++) { + s->setup_buf[offset + i] =3D value >> (8 * i); + } +} + +static const MemoryRegionOps aspeed_udc_setup_ops =3D { + .read =3D aspeed_udc_setup_read, + .write =3D aspeed_udc_setup_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid =3D { + .min_access_size =3D 1, + .max_access_size =3D 4, + }, +}; + /* * Copy len bytes from guest memory at addr into the IN packet, going thro= ugh * a bounce buffer one buf-full at a time. Returns false on DMA failure. @@ -708,6 +744,7 @@ static void aspeed_udc_reset_hold(Object *obj, ResetTyp= e type) int i; =20 memset(s->regs, 0, sizeof(s->regs)); + memset(s->setup_buf, 0, sizeof(s->setup_buf)); for (i =3D 0; i < ASPEED_UDC_NUM_EP; i++) { memset(s->ep[i].regs, 0, sizeof(s->ep[i].regs)); s->ep[i].pkt =3D NULL; @@ -754,6 +791,12 @@ static void aspeed_udc_realize(DeviceState *dev, Error= **errp) ASPEED_UDC_ROOT_NR_REGS << 2); memory_region_add_subregion(&s->udc_container, 0, &s->root_mr); =20 + memory_region_init_io(&s->setup_mr, OBJECT(s), &aspeed_udc_setup_ops, + s, TYPE_ASPEED_UDC ".setup", + ASPEED_UDC_SETUP_SIZE); + memory_region_add_subregion(&s->udc_container, + ASPEED_UDC_SETUP_BASE, &s->setup_mr); + /* Each programmable endpoint has its own register bank */ for (i =3D 0; i < ASPEED_UDC_NUM_EP; i++) { g_autofree char *name =3D g_strdup_printf(TYPE_ASPEED_UDC ".ep%d",= i); @@ -918,8 +961,11 @@ static void aspeed_udc_gadget_handle_control(USBDevice= *udev, USBPacket *p, * Reconstruct the 8-byte SETUP packet into the SETUP data buffer where * the guest gadget driver reads it from. */ - s->regs[R_UDC_SETUP0] =3D type | (req << 8) | ((value & 0xffff) << 16); - s->regs[R_UDC_SETUP1] =3D (index & 0xffff) | ((length & 0xffff) << 16); + s->setup_buf[0] =3D type; + s->setup_buf[1] =3D req; + stw_le_p(&s->setup_buf[2], value); + stw_le_p(&s->setup_buf[4], index); + stw_le_p(&s->setup_buf[6], length); =20 /* A new SETUP clears the EP0 STALL condition */ s->regs[R_UDC_EP0_CTRL] &=3D ~R_UDC_EP0_CTRL_STALL_MASK; diff --git a/hw/usb/trace-events b/hw/usb/trace-events index 931996e8cd..e84561d2e8 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -381,6 +381,8 @@ canokey_unrealize(void) # aspeed-udc.c aspeed_udc_read(uint64_t offset, uint32_t value) "offset 0x%" PRIx64 " val= ue 0x%x" aspeed_udc_write(uint64_t offset, uint32_t value) "offset 0x%" PRIx64 " va= lue 0x%x" +aspeed_udc_setup_read(uint64_t offset, unsigned size, uint64_t value) "off= set 0x%" PRIx64 " size %u value 0x%" PRIx64 +aspeed_udc_setup_write(uint64_t offset, unsigned size, uint64_t value) "of= fset 0x%" PRIx64 " size %u value 0x%" PRIx64 aspeed_udc_ep_read(int ep, uint64_t offset, uint32_t value) "ep %d, offset= 0x%" PRIx64 " value 0x%x" aspeed_udc_ep_write(int ep, uint64_t offset, uint32_t value) "ep %d, offse= t 0x%" PRIx64 " value 0x%x" aspeed_udc_pullup(int on, int attached) "on %d, attached %d" --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067799; cv=pass; d=zohomail.com; s=zohoarc; b=F4prN1GDBzFm9i2ocsZlPZ5U7KtsL5dWgFbiOziFGZaP9stdOpvX3so1YE0aQu4A5CI50QcT8TPxK4OwndK78wUm8SWmp8qKtv9K/+VO/6jZZ1VlP16lXLtKegyJC062XdLXQwSF/0kZ+62WWNxDF2Fuj2sXUojBK3ng/bupMxY= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067799; 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=uU/JmFyj8AjEXc6vxUStaeKcG+jPAL6ABpcehOkBosE=; b=UX1jDG1Ys3xosI76DCKxQ4f8WaObwtJCRFjxh4PQsEtbvf9+JFtQQI1QXr2wh3Nyizon31QaRLHuh8zLVbK4trRvXjxBDSAmILBFhf/ioR2aIntxYWMXABdTd2hxDRSiXBX1VvmrZj2RZtKcDd5cTVQqBZkwbVmxnlDey7qpH8A= 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 1790067799047438.9333644754289; Tue, 22 Sep 2026 02:03:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOO-0007Z4-26; Tue, 22 Sep 2026 05:02:24 -0400 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 1x8wOJ-0007W5-3h; Tue, 22 Sep 2026 05:02:19 -0400 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 1x8wOH-0002CW-A7; Tue, 22 Sep 2026 05:02:18 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02: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.0428.015; Tue, 22 Sep 2026 09:02:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BqGIGeYEqHacU0mh1zXUQJSj/LIfxP47abufEmNVz20iHurOTmzLV3yY+4Asr2LyR+FLxZlMY2z5L6HF4Atd3z9zeaF3KfoU1myexj8tLcIcvfr56tHR3sxC/pGZ3dPyFHgvHCxQK5c12qcwqLlf0fsdCjOvgHgE2wB9uL22aNX5LI9f2k6Uy/WcfrxYuSWZK6lpMiVtM84HIvMLgbECWSC+OhyXzEEI+PhFk3Vx8X1q5zyG3g9RwZPljTjUVeKQMKxlzX02LPJtVaWOM8SgtKDLn/fI8ZRafW1l8flS60pAWiPZWHj/jXcJ4LlwAG1S8TuGfqTH9B7MeK+M6Ml5Lg== 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=uU/JmFyj8AjEXc6vxUStaeKcG+jPAL6ABpcehOkBosE=; b=OrKC+OMMb+rOCB7WSGJi2QDAdGSBXGuDR8SDBDU+4iZf1m1pofK7BXsyK/kqiVMTef4tHZIPeZFPB3tO2PeOPykT1cD3z9MFMOcufSd0UENokJ/A3BdaMGd43ooBUksLy1LCS8oiNiadBIESis3ON3YijfQSmV0gDY0bOsMJg6O1DQYcSwhE8uE6esta+zi22Z3FVkcoovp6sT0490VlDHfyN0XB+RpLD3pwqw5t63aQ2nyDv5O0YFdg6zXcOhgD0+gceyQF2kquAxGIvsxRslKwoSGXJYCoyTFJgAqgn+uBU91JCq55WpixkWg3Q+rRFmhD7jZpLEzE214k6G1EOA== 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=uU/JmFyj8AjEXc6vxUStaeKcG+jPAL6ABpcehOkBosE=; b=Kqz0IpbUI2O9zBk/96XFHigH4l03UmxCo14xZIQH3+p6/IzqZnSCm5EcK8SQjurXRgkgneJFXNvM39km6LEcd5RR5SeT7HNbcZVfVs+regcg5UvSIt1Jp5KwFBEj25/9W6r+OpVdpi2yUnoSO68aNliZSP6t8rbqHl6ne713ODkqfQh+ZvVUpsMQpHW5UBzDE7D956bXhAcdSp58p7hMqqCv62IDPbT/2o7CXvesqKo5Z7Sud5dR4wLA89wjL90hdhY7rJfo3od011lXvxXZ2c/4bFdJ8/Eeuvi0jjdicTTWkV7ka/UweHn1eoyjdmOpRz7CkIBfFI8K1aJc2XE2yA== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 10/19] hw/usb/aspeed-udc: Mask the reserved bits on register writes Thread-Topic: [PATCH v1 10/19] hw/usb/aspeed-udc: Mask the reserved bits on register writes Thread-Index: AQHdSnELYWGsFRo56EGJRFVl2z0+aQ== Date: Tue, 22 Sep 2026 09:02:08 +0000 Message-ID: <20260922090154.1792077-11-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: 83f07ad7-696f-4f7a-49e1-08df18882e6e x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|56012099006|10067099003; x-microsoft-antispam-message-info: cr70NrLW1WNXSegptlR6wtgkpBajQ1WVONTpUdA80Puxu+oQwIu0X9sguC6efOBJP3fPLxMkQWFaNsTW3bN3olK1JE2ygpVoF+qrvC6Jzmg5kgbNvRpWp7xpvARmgl763sCOaVIa9IyCRP3VP/cK4y++pULxSi1RkLjltRKfbyVEh+u0vxKxaXJOjhGBJ9lfHrcFE21ZkihYImKcwF2duirDSQNM1ojNOnkCZxVbC0C+Fj1GyeMpUIBki7BqFVf+QmwdxREtzkHL8abiE2KW8PX8yeGXxuZk436rLObJjfF68O5GTo/xcQa0/e1XQteWyv7zARbwOygfD3m2gH9rVeWOPZNgdNdpQ3o3WZ83sNyShjJYyxQaTxqf/inj9TxnU6BZNOjwNoEAYomWJq1ugh4xo+sLONNsE7NP8AuJJw92pCvYCw8JPMPUrEkUYnh8lL27nZtyseQbGyVjG1DqtAb6wdQ+mKo8M0DBaFaHra4tlClCLt2abYioV/CWeNWSwJcrggbDU5UsSgzlfVfS9R95oXMSiKu4K1iAP35tTlSMKTKOzkVHgDfj5X+2ix5jCqcnmYQzlvtx2WYDEv4JZwd1w7MTG9I4s+se60n0iGstHGYGmAYFpTCVgVeBiYlYs5jXtely+i9AccK1uKb3zzyrtSdyQcuxI0Ays+hFq7fa/4m0+AzW/TMHhy5r/r404oUNSACwk5JeezHm9rg/sdGKbKScW4Vd3BVUC6LOLOY= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?L3VCwCvACXYOYO3zcbfWrFNgMI7cj/jbkZIlJFxPP4BHTaS8QlafYcGaId?= =?iso-8859-1?Q?9Vfar9LRovdPVW5F/6bnj+fpYX9lRU0ZNWuGnYymDcFbo/3tR9aa0e8Tx8?= =?iso-8859-1?Q?Tl/hP5LW6w/j6lmoSy9uNJ0dTpjY64XX7c085KkHji5MckYEvAyYJK2sZF?= =?iso-8859-1?Q?LDuLa6aY/ea5vRmG4DF6AWwlS5Dfa3DdUdSOMdAy29LVfjwTKrXpsJg0Fs?= =?iso-8859-1?Q?h+lCaB2GE4n4OF+D5+ZQNd1SzHKgBZd3quBTktDlR7IpWx+sXP9c53lXVg?= =?iso-8859-1?Q?Dnh68cpXjSktZG0JDDZSuTxlQIYZcuXrx5nXRvD5jtia4D71EeendNxP3z?= =?iso-8859-1?Q?kpF20TKcV/UTPKP38PY5i/fwzIrYZDt0vmA8bZz886QlPf9IMNjmVJ3rqs?= =?iso-8859-1?Q?2NnqfmiqUsdto1UFDOVMenGjpefLNl0fP+7aX57Bx++vSrmWJMs9DB8hLW?= =?iso-8859-1?Q?6U8miJq9BOHYDGjn/jKUx5vhTI+eyNp/2/C5OA8KXAxBOENpBXFO0y5vgj?= =?iso-8859-1?Q?31Nh/Mg2VEJMpmwVTpqgKoNprmSds2YSJOr1q9BvkdV+8VKiq8wG2mGJ5/?= =?iso-8859-1?Q?5Ubd259eY7DUOqeq9kpUfXbyDZAet0waEumurifBTbmUFU9fd3jrr0s9KI?= =?iso-8859-1?Q?/GnkGqED6S/H+rjNzcMf2eIfZG/C7d6LE5tn6BnZyTbA2gLIiq6UU0j3Y/?= =?iso-8859-1?Q?fwTkgfMoDyHLtf/GXA6UPnQ3RS/COeLaEe+XgTyhfNQlpVnjMpDi611I17?= =?iso-8859-1?Q?aiFNatT+FYcUChF0yM8X4I8trEXivoEYK92ZOJnwVlCSkoPR1nSyq6J7zv?= =?iso-8859-1?Q?EbS2mqbF7OFHAVC3HUlH/Byu1cj4/uHx9MdATu8lCKn3sg6PWJy2hN5d4y?= =?iso-8859-1?Q?YLVjxdXBEeKgEtu9BKkHxGj65BKvsr5Pw0F18+ddgxnaLlxjNRMZZxbH1I?= =?iso-8859-1?Q?aPNVZ1VzV3gte1rMc57Q0mUCh+4i54OBXBdNJozF54V76YbuKmHuJxMIHB?= =?iso-8859-1?Q?K15Z3MJdEIVzVS3UWLw5/5dNHD8rkJXD4aypHGr5Yu/iz8DNYmqZ3uLt7b?= =?iso-8859-1?Q?6DagpRJBVpNjNulAWdjiX6e0JpT4qyos65B+o2/Vi+3d5+gmH5RDAcwiCb?= =?iso-8859-1?Q?wq8TrcivNsiw+5+CqDe/AM1GgWr/KqbxameM2irl+HxoaiiwTjeJ63rQnS?= =?iso-8859-1?Q?gmyZkNP8ug0HoSNPt5HYHipV+hu+dN0pxaUn70rEvHAtd8hezwVWPa0Czq?= =?iso-8859-1?Q?Lk2PD3De09Nxpr8ASwMmhTPRSBVhS3s6jWt21yYGx50k7NU4FDFimlcw3j?= =?iso-8859-1?Q?Mki8v3McM9vAtnvJ4+fTM6p5YCn1nD6fm7TuZ6NfBcEjIaQETSJEUcm1g+?= =?iso-8859-1?Q?9yjyfKO15TA3CP6MQwdc6drrYkD01PhZlFGRTli4NvcRhZz/+UfVHpXeBk?= =?iso-8859-1?Q?BvqXaeGdLhTmdmAqg3XpqGa97ySaqyGXYnuoLOIj/e52p3MeW7FMaUlnCL?= =?iso-8859-1?Q?zvxs1pRH8bnUYIs7zrpw1LTanKjUqzhX6ciumICqQ65eDxSVGuqRpAP9PU?= =?iso-8859-1?Q?v4MhtwFcilZJKsZG4e2nkGFKGYjBwZELqaLSfRk1ayHm7dvSEFR/+4sWO0?= =?iso-8859-1?Q?KmndrN7/EWTiBllNQ/FwzfA/7ALbiXXCbv6ecHH7Yy0Q8jCDK1BtZL8uA/?= =?iso-8859-1?Q?oNvLMIc4iIY12n09YMt+WSwvPO3g7a0FBLBYj8ANc7vh9XFx1MgRJMJW1l?= =?iso-8859-1?Q?cJbsh6uGgypXUS40ec2haJcQ5QQaxYrTXZkVqcMUrlLkhmxMBo1pNDbP82?= =?iso-8859-1?Q?lM6pJkPpSw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: BzUS6KixbOw8DPGEPhTZClZEtRPVDILEJ7/3Pi47j3FXSZGxbSdlLSdNSlACyLImzc/vcd+fyQDsitJ4GCVXPbzf9LhL1FXqZDCMLn4/YTOoy0Z+Z6Dj8gb726I4+kLKhzrFkOg9aA1TZwRyR7yZiW8Cc2xZWs83IbWizdxMdBZhKrGNrTH8VScVQ3CK8UwneVnWVUdmcO6Mb9ABazaXaQWLD0M5t4KaNeVGXaFGY4GONJNCe0uGZ8pIA1KXSERjGdrErLuEItt1qghUl1Y28j4Gul2mQeGIEYxGQ3WcUxxwLVN21iM1ANYUslwV4s/NnuTUZGQ34iXk3XrZFWqr9A== 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: 83f07ad7-696f-4f7a-49e1-08df18882e6e X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:08.0412 (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: f3K5+OoR23jQ5LqshtpwNB0c16uv+FKNNfeD1SHA8BteepYvmEXuXJTfqrX58Yu1Hrt6ikq7ARGeb3bwN7ggw576ORNbU0otHq/XWoMzGXc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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: 1790067800839158500 Content-Type: text/plain; charset="utf-8" Writes to the interrupt registers were not masked, so a guest could set a reserved bit and read it back. The hardware returns 0 for those. Mask each one to the bits the datasheet marks read/write: UDC_IER 17, 16, 8:6, 4:0 UDC_ISR 8:6, 4:0 UDC_EP_ACK_IER 3:0 UDC_EP_NAK_IER 3:0 UDC_EP_ACK_ISR 3:0 UDC_EP_NAK_ISR 3:0 UDC_ISR bits 17 and 16 summarise the endpoint pool. They are read only, so a write cannot clear them. Signed-off-by: Jamin Lin --- hw/usb/aspeed-udc.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index 355512822b..95fe823534 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -319,14 +319,24 @@ static void aspeed_udc_write(void *opaque, hwaddr off= set, uint64_t data, s->regs[R_UDC_FUNC_CTRL] =3D val; break; case R_UDC_IER: + val &=3D 0x000301df; + s->regs[reg] =3D val; + aspeed_udc_update_irq(s); + break; + case R_UDC_ISR: + val &=3D 0x000001df; + s->regs[reg] &=3D ~val; + aspeed_udc_update_irq(s); + break; case R_UDC_EP_ACK_IER: case R_UDC_EP_NAK_IER: + val &=3D 0x0000000f; s->regs[reg] =3D val; aspeed_udc_update_irq(s); break; - case R_UDC_ISR: case R_UDC_EP_ACK_ISR: case R_UDC_EP_NAK_ISR: + val &=3D 0x0000000f; s->regs[reg] &=3D ~val; aspeed_udc_update_irq(s); break; --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067951; cv=pass; d=zohomail.com; s=zohoarc; b=JQIYhbUUJp4pOH9d343l1ZCJYg9VbeqDIjfIUeJ6M92Nj/1OutDVvsPbfQRgzK/PiiOXOuYDoIeDGK7npBi5Ga4bCx3OjAYHNPdS/1hmQLHcqjwbIYuFyWGFY6MDAwpdWPNmYGlRPvSCzuPGBCIULwYlzolikvA1fzEuUaYnMwg= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067951; 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=d0L/Mwf1RIAr6N98ejl9UawWtjiPcD18EIT02CW9iHM=; b=EgPgFciRdI7gjut6NGY0k9Rr6Kv3/JFK6BfML9dnNFBCOcFkEhOyOcSNYxmocK8RC7lWz9fccmZmHl9jfOBmSxgArUomKJdz/AI4oxRYyD3EG+IFki8yPGwdf81uS8nOPaK7BNutxwjfnYkTnMJ+GZ1qXMDU/tXeAbfYVO5Ll/w= 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 1790067951070847.371137731786; Tue, 22 Sep 2026 02:05:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOR-0007ag-21; Tue, 22 Sep 2026 05:02:27 -0400 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 1x8wOL-0007XE-OH; Tue, 22 Sep 2026 05:02:21 -0400 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 1x8wOK-0002CW-05; Tue, 22 Sep 2026 05:02:21 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02:09 +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.0428.015; Tue, 22 Sep 2026 09:02:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=cSQGDLlY3YsNicJYckMXnz4wbtDVy9ciT0aXjF2ddO0ghJ9K8tQavboqZHKZtpiEBkeMAXf2J3XWzxez2+Xl71M/hUaBOW3GatfDRvLz8dO/X/D2PkUbYO+JDwLBSS/omtpYpU3aIOUkFJT4xx+TZ2IjuKAjEdf9F9JoyF8vLgzGCc/FWZSM5pt52ATTgiutWbFoG4nViQkhx17vAD/c+Q5C7974NG43oj654iDdXoL9CWI0PnjvMLL1+POQk12txAYj0MhgZfSnObZ7+Gy2bj6nBXJAie7vmk6EyeGP4GK1MVPn1gDbgDikdNtDHv1VLyGzsd1twgAgnx7EKbRxBA== 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=d0L/Mwf1RIAr6N98ejl9UawWtjiPcD18EIT02CW9iHM=; b=isg8ZhaBTeE0FEATBig8czkCP3xJxQGC8d2MQYHVlzagl8cpOOqJbNzbwRvmAs/vZWnp/PuJWfUnKFk7dJCAVy2b+7aZstE+G1eKRPBq1suUg2kUZGUeBzkCGpbmXZWremiANoQp5eHC2wdIKIxfEOp80wjdNPCFZByjBxlim+T/pve7lwEdf8x9zUF7IeEUISs9jv9nK8F2II+MPSNsJOoDpD+jThkk/aWbui7qmH8gfAJrkKa7RNWqJ/cy3oOFklqEYvOLeWH3Q8F7jdUcLOfL5ppFOC+EnpDvgBrQ99wm47+AZyvvjg9maaRKArq3Ev38rVoJ3te07vFhMey81w== 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=d0L/Mwf1RIAr6N98ejl9UawWtjiPcD18EIT02CW9iHM=; b=DZ5A9dlkvNWbmEF6jf0r77ZaZk7AYknzs7/mOATRLuBc+x35Gmg/SopOLFQ8xqRH0C5OJAlhbNqo71+UT4Y1s3rzl9LnHVfJW9Uc1O+x2C/h1X9DENTn544D+KRS0w94lwQ9ie9jo2wqy23zSLWMaywCmT+B2yBtzAc9xGTsRbNrOow889J7KiL1Hgp2wY4p69zOJd9R44gUFHb9Vj1MDcG+cxN5LxZtVyLyhdwEVD1V5tk8rpP0YvOjdOnsQW4hl5snd+YMuBdF3DGXtMWid7lOuy67y225kFCrvd8ns6hVSRQ7CEpZvA++PY4sQynQrvEhpmMkn8A1w/IcOeHkEg== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 11/19] hw/usb/aspeed-udc: Clear EP_POOL_ACK when no endpoint ack is left Thread-Topic: [PATCH v1 11/19] hw/usb/aspeed-udc: Clear EP_POOL_ACK when no endpoint ack is left Thread-Index: AQHdSnEMR2xlAsgw/kuAYZPi1utrtg== Date: Tue, 22 Sep 2026 09:02:09 +0000 Message-ID: <20260922090154.1792077-12-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: a2690d85-52e0-407b-20da-08df18882efe x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|56012099006|10067099003; x-microsoft-antispam-message-info: CjwMeGQowFiNGLdarsJUZUd5/quIoVeYcJv+Om/fz6JuohAYk249j+QO+0HZ3VT/lpCoJo/WAC0hlvlDeCq8xqXB8KepVIbUnnH8rSCHj8r+NQExcjQWRXeX6cNy9/lgqd5r862bhk4k4zvPWQEVrdrmwz4VtSKWUMS9Ws0EdxT0NWJ9kPoe+3s465i4ZhHUzx635uXpDoL65Qz+wyhXopK0ZvaqEzLjaVbgLyUrWtHSyUw7WdqBq8Kjmlv7k+OnumnYC0VxDkTG0/9I15Qhb+QDndEiaazx1w+tzRIAv+Lc39smRINSOH7XVNEDq/3oANk0Y03g+NpaWmcPc/VrP3QzNWHGMgstFVkRlTnieznk5+GPxegSHByGXBUnVVMoq5TzHlt/2MullnAo3khwI/4ewAmrEkgDNyET1T9YWIbIPgesmX/LyktOkpHcnThXp0ajI6BbxvISqDEZQ9Sv7HNYd8rQfVEL4LS2NNBqxin4swYUbc6rMoVxO8iI/HrIunsEzei26ptjD/LBmtkQasA4VJ/XqXXPuo5tV8nmugs2pAc5jJGNjhGhfW7eSLMe2ZnM7cBhUZ5xIWfg9MBVY+SDifjDmRUp8gOjKJAMq+VCSwCLASC27XViOsWumQf/UI5w27l7B5AHNGSvP/4+fB7Sn+mwTLxwacxmgHOfrYmFOwnmOsTELFIzU/E3Rs8gmwyc3jKb+49cwBeWGGLH9i21BZfT5Ho10pcqURi/eyc= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?OYh6BZVmOgRcTAvc8I0AO2/8nrx1h7IV570toTQz6/iTbZEl5nkYcLb33u?= =?iso-8859-1?Q?iGXsPHbWwsMSMSJGvuNcBYk5lXGYK3eB/+U37CLx27KyY6Li3I3t2DyIzP?= =?iso-8859-1?Q?fXvXrp/pD2t6GkTJr3OZ6y0uwMBLSmiS6kz3Sdf5eF1eCibod9YkLD9+De?= =?iso-8859-1?Q?GAEs0vUnVVmdIxcUrR5O6bdykIigvabCgPfEB9ZYgLrWCMIemUAcLYqbxR?= =?iso-8859-1?Q?r6e7bQq2W/3nlJ/7fgdh/X0o6HObkH04jHENUxpJ396JOR9btGP7snwXiF?= =?iso-8859-1?Q?tgpTaut++Z9G2WjQ7pbvpXwwxGgkDECmnjdRIaqsNacIT05Zx/39czAMWY?= =?iso-8859-1?Q?mGRg1A3JkqlQvRw6xY0j5dUN7uaH4QsCuxJahWkvGz8HYGLjObc8soK9aP?= =?iso-8859-1?Q?cMMluVCgyVBtrUeZuvvVrIzK3ZN6S7J3M4qPYQj6IOeOIlck/w+5JN/qRf?= =?iso-8859-1?Q?H5qiqhD+Xyd5QicOeJHJDZ08wsBqc3CGRjuDpU6XlLgSqRkiu0zRUehY5Y?= =?iso-8859-1?Q?T1fQRbRdxuKH5XjhumGMnRDuYPgbUZGE1Eju8MMGgWUU60YIDFEScKfdtc?= =?iso-8859-1?Q?pBsI46GMbHKIXyANuKJ56ht37lgCWgOJcJp4JdLsgDHc66Jo+qP4+nZzhm?= =?iso-8859-1?Q?Shrk1zgfV9LtJrXO6nyGs073V5lBuWbtO9M+M+yJkQJjsknLSzqGKMTbFa?= =?iso-8859-1?Q?7P23oRDC96UGQHAdM+NiAnVDntLCqli8+35bdDgmaPl1ORlsxa/NTrjIVe?= =?iso-8859-1?Q?gQWlKTmHZcaN3fod/sc3XZBak0/JT30YJPjf3bSxJ+E4fRY0xgwEDI6bMa?= =?iso-8859-1?Q?8R9pzIAecLSMnPj+F066sPhqrNpIUNIZYy+OX83jp+EqYglzLZLhbU+Fm/?= =?iso-8859-1?Q?V93i+GRum5O8Yx0rwBH9qqBv0l4Qq18jswZvTKPyDLi+PZxJxYUaoSt88v?= =?iso-8859-1?Q?1ITXPB+MO9XtehlU9EtrWkg/Tny2ps6gJTmGlwE+cn2v5/PEew82xLLjcH?= =?iso-8859-1?Q?t8SuijLgYYAUUPAHl2TsRl9cK2mVgYaBYnd/lwarorsKhee58yMNem3JQa?= =?iso-8859-1?Q?HvUgv1AmvnTVQe+SauK9ckNV0diVzbuxSdVOd8I3+FTHiInA0nbO8FUQ7A?= =?iso-8859-1?Q?9LtD0xRhfqoLVhsYwjlE9BUmnYXoPGLfGatBdJzN67YtE+T4DXEOsHECyj?= =?iso-8859-1?Q?NoPhYm/R/7aIReMjk8YKEvt+CvbBbzehngEvhP46+zDpHg0WK7j7k4q/Tf?= =?iso-8859-1?Q?ey7BVZhQeMwmjca0FBlrSfwfpa05mPuxGpR8RfJBvM+Pnvoq0E/zXO4iuj?= =?iso-8859-1?Q?G1Il5H1C+8fgXgR1P2gN8QggyjV/+Bs2VqTGYEUpMW2DIEHBv6mQb7MgAt?= =?iso-8859-1?Q?R1PH4tWYQcKstlrLjaEnJPuwk7yyVfN/JensdwPVEFn0WvDUkAjcbi5LAj?= =?iso-8859-1?Q?VFsgO/8nxu9LVypICY/Qh4W+4JXry8f8emIh8Ut0k4N/nSnrrJjNbniLin?= =?iso-8859-1?Q?budZlJLumRdIkuxQQUI6VzaiuRTceMQ9niiB3oJn5tuQEidHPEPNuN8abC?= =?iso-8859-1?Q?qd52OOcLquNtYSteU+C3Do3Sp4HP/ruFsSQrMQ9GgnaScP/COKbNx5Jbtw?= =?iso-8859-1?Q?FbcBcNF+C6Umt2AI+7Ikl5ct4jD0ink2eqrKrQ2K21cG9vW1uZ99FUSp07?= =?iso-8859-1?Q?Rzy+toOn1/miN1Comu4oUOeYuXmClCYfAjr4AxRzUyRWjDETPQd7INe2uK?= =?iso-8859-1?Q?mXVaEjVPdHhm4tKwKRsGl+eVOd3vY0wH8V7Ivoz1tgmPopXKX4pMlMhrmQ?= =?iso-8859-1?Q?g1YnZ+GYUA=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: T/gQ8PHwBj0D3p73TdCjv7kujQrGyC6dc81cphRAU2C9tbYDE72KPh0u3xh8Rsqf4PP/p6G/fo2tQ0iAx5Q8LwErRlLUEFV5FLAkSHVmC5BR0Eb67pJYHUH+4VhvPyxvLJcKh/xwD5tKEpM4qVCvKXVxwnBQFM3KEVYXNoNnPZFyODMLoSl82CrqC5+CPfpfmVR+skLeT4Idx83dZZ0lUN4xdJs4gZeUr9F8YNDxzbm+ZDzC/oRZamSuEOb7v5Qa9QM5CRPRBMBOiH1XOnbOFiBrhdTEsjWascxFKz1dSk6PWiN7TgfEiS3hjecd4TO3iS7fbuTH1/eiXDlfiMDf4A== 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: a2690d85-52e0-407b-20da-08df18882efe X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:09.2319 (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: x8fERE43aPFpuF2abvnKNnp+uvesGx+hsAQ6uLqv+N7sg3EutlBH9lUheBpCDpbBDnfqI6dm6vePbVUd2JXwqOmTChB/l0M11D9ABByOJCo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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: 1790067951988158500 Content-Type: text/plain; charset="utf-8" UDC_ISR.EP_POOL_ACK says that at least one endpoint in UDC_EP_ACK_ISR has an ack. It is read only, so a write cannot clear it. Clear it when bits 3:0 of UDC_EP_ACK_ISR are all 0, which means no programmable endpoint has an ack. Signed-off-by: Jamin Lin --- hw/usb/aspeed-udc.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index 95fe823534..bdbd1a78b8 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -335,6 +335,13 @@ static void aspeed_udc_write(void *opaque, hwaddr offs= et, uint64_t data, aspeed_udc_update_irq(s); break; case R_UDC_EP_ACK_ISR: + val &=3D 0x0000000f; + s->regs[reg] &=3D ~val; + if (!s->regs[R_UDC_EP_ACK_ISR]) { + s->regs[R_UDC_ISR] &=3D ~R_UDC_ISR_EP_POOL_ACK_MASK; + } + aspeed_udc_update_irq(s); + break; case R_UDC_EP_NAK_ISR: val &=3D 0x0000000f; s->regs[reg] &=3D ~val; --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067975; cv=pass; d=zohomail.com; s=zohoarc; b=NLiyTnkMsVAmPgASLmyaHCXSHaAWkPmSftAGMW7ArGGh84DgcaBnOufJyNw3NlVqoSZE0zdvQSfV3379fkEoilgZBWR3BA5poSJFhuI9Hsabive+A/bRc4VCnSCqS8ToQS2KOwdrel+w5NHvKfax9W19WSmpJyr5GmgpB9nnE5I= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067975; 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=duBaD98tIGeDEtk1itxS/Ac9/+/sHyocX9LD1O4Fw8s=; b=d+hJ97FPIW1pT31H9I6dpJ3Wgo3cuU5AmqbvkJDmFQ7Rf6lTHKLjoWy5t0YNpZY6w8VU1sjasocLvEhVMUO6DJ7qU8pRrh2DfGwKgVlpk4sAiBOG8SCRvrzIbPlD3w58WMDcTn/HN1SaO8I+D5rD+qmsoD2Ifg2F8a+pnn2FaR4= 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 1790067975977122.36922414579851; Tue, 22 Sep 2026 02:06:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOR-0007al-Gf; Tue, 22 Sep 2026 05:02:27 -0400 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 1x8wON-0007Z0-Tv; Tue, 22 Sep 2026 05:02:23 -0400 Received: from mail-japanwestazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1x8wOL-0002C2-MF; Tue, 22 Sep 2026 05:02:23 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02: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.0428.015; Tue, 22 Sep 2026 09:02:10 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kyyb9U3cSKYxUy+v1/YHHQUOovSkftDfqTA9gde3Q2j9HZYIc43flmFaY4WErAflX9kFusaG0OYQaG5KPh2BewJ3BMA+oZ+qJj48vmW2cxnTzZJ3l+B4Y5GxuwbUHu2DlPBQZ7HOHDN3kvAJnuAR3YqDcDfUy43Bwk993d7V7a5gs/unSGn/W2on1/w+IFeKFVieL3t3K/qUEDvSqVP0jfSvMCBkzJrtwMD6hYLN0J8GWH+/xjLWfdAb0F/SBUN/Q4d7/YInxmBUpYVumiV9hVocDf4SDvaZNXukbr+8pv0xzz6HVjLQDWqtVAkq5SIeV4mKQWQOTRlFsckgAiPSrw== 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=duBaD98tIGeDEtk1itxS/Ac9/+/sHyocX9LD1O4Fw8s=; b=b78K+7qikOTJ7IVKMpYvkFKtg4CVHGf5o4+V8zUvyORqhSZ8ujGb34yVhqCfzk2Tl/JcQ9h0T6KIri37bKcJHupY7JN9UTWY5M9mMLdDDX8fYFPEbJKRQuJDl0ic2ZCtsUFyjmpPUBpMBLHTVCLWVrFwn2K8jtnQx9kj4QPj6+VVz3MRZOo4DwvUzKaz4qzbI37KJZ77ic9yGZLfAf/xIVCOLzGW/Mzdq99o39O6hZ5R84W2FaaNaO0qWtOBYz0EOKAF3TgfI5BR+Kr9LmyQFN2eEdabNIaZ1ybIIUtnY3ev2aEDBi4Dgqt0kU2ZDnaOTShpopwHXlm2ktYT1+bFAQ== 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=duBaD98tIGeDEtk1itxS/Ac9/+/sHyocX9LD1O4Fw8s=; b=o2lvRIHumfl38LfhS+he6JfjqxG5kQ1zCTzKkE+K6OaWQeRU/RJ9DFCZkmHbE6at5cjJCKRRM5sDAScnBuavZiIj1d2tlSU69i0ak6arHKUN0wELj5qcE5dRwOzjs63lOeeCURjFtmJcAr5T1f1eDlgL+0yCUGqdqsaduqpmaaBBQZv/j+nMD+xhQaG8uyJUNa4Rn22bmMPpR1eYXnEq2mRFOLZ04UUJuqD2e1litPL/JftWiD7dnIKz5u6GkqfKlgGFeETOvHx+xOTSeZbun76gl3K29OrPqvaRvJe1jmElvlg268EVe2KiFNwzy27KJcEgyumQ9GOyHN4FuqESBw== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 12/19] hw/usb/aspeed-udc: Rename the transfer helpers after their DMA mode Thread-Topic: [PATCH v1 12/19] hw/usb/aspeed-udc: Rename the transfer helpers after their DMA mode Thread-Index: AQHdSnEN+phEY5CEoE2PkrYnuVIONA== Date: Tue, 22 Sep 2026 09:02:10 +0000 Message-ID: <20260922090154.1792077-13-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: 874fe988-5284-4ae3-a3b6-08df18882fbd x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|56012099006|10067099003; x-microsoft-antispam-message-info: Vo7EsrZ29EFD9zr8/yw4u2YWhlCdu+pyXXciE/QbhJFJ8WU/++Rl46Yuvsj6iv2ho7EZH+VtdeQxHFpFf4Azy9eQJIMAV6OI/KADmKchhQdrbkqEeocib1DBaOtoPANlbn2rYZIVIDM8cM08gnM+La4qSLPsfeyGUSg+EmC90kErNBrxNQusAHyjoyMGRcath7wLLw7gQZluqm3Qg0mSL/XQX9/VmS93SlZ/dN2el/gLmTIfyfPW51E26qjUC9lsIn0Jbpk8g/ojiVd3n+gdWVCjPOv336hmOHvaNRwnBFf7JAciWn7xREznB8GBC+bVUxLoV1u1SJ8YyZ3oyF9i1X42Gd9BjpUiqvkMIFDxan36cNxKk3CQpOupvO9PNHqmzA9jvIbUrvh/88PDmjzxdB7Ta0APlHGmxlqoaydX0KXeSUUeF4KzmJZonyzb4Q+GkH5CIZHcQdtNiwskJ0Xs7hhxmL8csnYUOGCYCFIL6CDYPSMSneQDh4WxYwmVUr+ITw2WnoOgybnqbiHiLGysF5lO6UEtZJ57QzbcHSV1JhJYS/UcZC+SppcO179hAm3SXIPJGGDZefi3PRjo4pQYZgSIUgZe/0FmynXIvsB58dgkWSVrl5Qn+AQuAQWma7TpXYxefT5tUslDTR6z48PhZerK29fAEYPl+wMTaOb90ViNxtBBO4vF1oDOPuBOSjsTTdAjnXCDXzewi01tqEQKcPZYecNpkwFOnNrKD2QynEI= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?CikBKbJtK88DvM43VibxKLcOVjfjAH0lasgWRHwc7S6ClleJ9a15QRhQPK?= =?iso-8859-1?Q?cvtsZq7ggtlrnzAN+7NKU0YGhGKyn0CACzDo4ahKrKQm1utJMLey+7ywKb?= =?iso-8859-1?Q?t41pQaC4DRdWhmPrVe8fuIb++dliOO9rgnIGZ5nic7gtw6VsUsMWnmLHN5?= =?iso-8859-1?Q?cA5hE2H023503Fdw/IYRB6kXh7EdlRCsjWQCSSORQulUY4/GHfFgLjCKUA?= =?iso-8859-1?Q?FJKhKtwsheOSnLiWg7MX+GfIqzCzhQmoG9JG/5qbkOyEGv71ioQkpbT0DY?= =?iso-8859-1?Q?iY6pncf9p7E/162qVwZOhTRYi8rxedlZSv9ipskuo+rc/X3MP3pSBJG8K8?= =?iso-8859-1?Q?nH95Xpp5waQ/b46roLGtyj6fDXfijibm6pUhP2oLyMEqYA8ukhNSDeOH1N?= =?iso-8859-1?Q?/UJw6Xg3zgn3BO0nmsNGFZ5OJZobMwbSvUyPVSZVp783ekxSJU32m34rte?= =?iso-8859-1?Q?hkw3X06VdMHWzKzym5wa2/qitlklG8D2gBATnsyTqOqEZSbBpLHUYwCajC?= =?iso-8859-1?Q?q0sS1BmzvNBtoLUTBk86/3oqKYnauoSaIjn4MxsIwLsXYytPX/D+7IoKem?= =?iso-8859-1?Q?Qagtubpni+VxngmZ8KZU1lFOwPTnNXXReQTh9sni0vOQaL+ZDMtEZBe0xe?= =?iso-8859-1?Q?O9HXqddC+LXySasAAzd6FgudvpZPEQcbtJ1Ma2cHTM0jIyY5PiYPFoh82V?= =?iso-8859-1?Q?vDfMKTJgnJdrYwzCkLmBJCJeXDOnkG0rxZXIsD3eWuH5xAxKmIDvKbq4p0?= =?iso-8859-1?Q?IeZJIBCL539nIrCFTi2wuA3fgC+NanEkfgQQgxv8g8aVKZjJzd30Fea8aS?= =?iso-8859-1?Q?MGfgqAaicTu8+noWUA5EXjP/v2/O8pr2xM4Ortmrq5DsY5Clp4xwH2AntR?= =?iso-8859-1?Q?B44gfbeYMzvs5B70ovuLiJJbesF7Q1rNMBYAE9q6Hz3VaUcoZ5cI2uoPyH?= =?iso-8859-1?Q?U30n3Bq1etyt3wMFIImrZyHXDte4qHZ/5+9Eqi7P7ZYgcA9BRdRLTgTlmA?= =?iso-8859-1?Q?K2jiNt25tVRaTfoRXYYQdaBrHjyFS6536e2OQOPMbyfmALu+feWDTDsyzS?= =?iso-8859-1?Q?9YH/ksmYu29A9K6ZKjIursOcgcKdNIi4vOVXXcWuAnowPDSMJfmwfTXS0C?= =?iso-8859-1?Q?co47nP+5ZD7xNkGA/71uuln3QquMP0Gg9jBb9bTtT2p6z5gU4ZZIdHv49r?= =?iso-8859-1?Q?vcnqVS+P6oEMAqLSj7ygsh0P7doYs2N5JU9D8dU3jlTsrRwo048Xv5EzdO?= =?iso-8859-1?Q?eBYbrfIRFd9qaS9CI5CAYePTWKb13TbMZ50dNLTFcQH35M+2oLvhCi7wJ8?= =?iso-8859-1?Q?tUsIrNJQkITN8YVR9jn3GimbGX+W86ynmaEHpnh3PhSJR98OJM1/yt8HOA?= =?iso-8859-1?Q?iNanforaq/uv51d5qExoSsd+4/fW04PpqZa69/UnHc3VV47sV4dZe2k9Qc?= =?iso-8859-1?Q?4s+JdO8bZrDJKlvkFcsSdPjHXY3V3rDAighnAIjaCzeMjmvSMruOYLq63f?= =?iso-8859-1?Q?jwjBaDshJZoCKWUGVz19LQaDa5nQTXU+ZRE0/USpktREhi6k/v+Fu+fNpW?= =?iso-8859-1?Q?sgF9ToWO+5fCvHBvYpGJb1QVG2jWnV1cOcUv400eh/47iBMFV/7wOu9a5F?= =?iso-8859-1?Q?MqsaEb0LNNn7KYv33WraS1pWhoCjPkFq/gQpQDSpvf2YXIpFTtrr7E2mHe?= =?iso-8859-1?Q?mW2K/KwPfEfwFR0gJp0itUWSLlHaQkY9ymDyY9/vA4InawUGMSZupJAAJe?= =?iso-8859-1?Q?Pe0FaXHF5x3Hq1StOkXT5bBL2NLuhJfg/s38tdUPUPIEpSLc7cCP/ENWou?= =?iso-8859-1?Q?avaQeGRK0Q=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: Sk59dmp4PdIMVCUMA43JuQ+no7qTqOV5B5f56eEEe9zWUjj84PQ26QGx4rvGqcSLynvGUi9N2Bw/3H/Ewem3y6Sk3YiMpHrKoQa+F/QwEGdmKDNp6PvzFch49IcLgwZCUYnrw9lf9c1smA0vOXucTYYgacnEBLaLobrV7/DfhdaR9ovepVIi7/v5eb2gbUf9t0wmnLok9OmbARpvyQN6NwJJyzUkXbiZJgSRkmrB+uyeiStScxHfAoA1ro7GuPgcUzqxQkr8pCAs4JlNJhGvMmdpTDyA+Y6I1HfvyaEFEOoDTbX/CdQyJX9pvUL0ApLzcluDEZmlYsF//E6ENkTfqA== 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: 874fe988-5284-4ae3-a3b6-08df18882fbd X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:10.4941 (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: x768QTZDv2nCm2SkZpGRi4SxIDm63IPKSqzbo+o+vHcXqMuzUShG+NoNMty0l3fFQT1kRfIZKWH99r71NDQy07zmxsxE8mJ4WBV0q6jB6eg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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:c406::3; envelope-from=jamin_lin@aspeedtech.com; helo=OS8PR02CU002.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_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: 1790067978026158500 Content-Type: text/plain; charset="utf-8" The controller can run an endpoint in descriptor list mode or in single stage mode. Put the mode in the helper names. That makes the code easier to read. No functional change. Signed-off-by: Jamin Lin --- hw/usb/aspeed-udc.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index bdbd1a78b8..b43f077c2d 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -459,8 +459,8 @@ static bool aspeed_udc_ep_copy_to_pkt(AspeedUDCState *s= , int ep, uint32_t addr, * This function raises the endpoint ACK by itself when the ring becomes e= mpty * or when a descriptor asks for an interrupt. */ -static AspeedUDCXferResult aspeed_udc_ep_xfer_in(AspeedUDCState *s, int ep, - USBPacket *p) +static AspeedUDCXferResult aspeed_udc_ep_xfer_in_desc(AspeedUDCState *s, + int ep, USBPacket *p) { QEMUIOVector *pktiov =3D p->combined ? &p->combined->iov : &p->iov; AspeedUDCEP *e =3D &s->ep[ep]; @@ -568,15 +568,15 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_in(Aspe= edUDCState *s, int ep, =20 /* * OUT transfer: receive data from the host by copying its OUT packet into= the - * buffer the guest gadget driver set up (single-stage mode). + * buffer the guest gadget driver set up. * * A host packet can be bigger than one buffer, so we copy at most PKT_SIZE * bytes per call, continuing from where the last call stopped * (p->actual_length). The caller keeps the packet parked until it is fully * copied. */ -static AspeedUDCXferResult aspeed_udc_ep_xfer_out(AspeedUDCState *s, int e= p, - USBPacket *p) +static AspeedUDCXferResult aspeed_udc_ep_xfer_out_single(AspeedUDCState *s, + int ep, USBPacket= *p) { AspeedUDCEP *e =3D &s->ep[ep]; uint32_t chunk =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, PKT_S= IZE); @@ -619,7 +619,7 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_out(Aspee= dUDCState *s, int ep, * If the request needs more data than was queued, keep it parked and wait= for * the next kick. */ -static void aspeed_udc_ep_in_kick(AspeedUDCState *s, int ep, uint32_t val) +static void aspeed_udc_ep_in_kick_desc(AspeedUDCState *s, int ep, uint32_t= val) { AspeedUDCEP *e =3D &s->ep[ep]; uint32_t cur_rptr =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, RP= TR); @@ -649,7 +649,7 @@ static void aspeed_udc_ep_in_kick(AspeedUDCState *s, in= t ep, uint32_t val) return; } =20 - switch (aspeed_udc_ep_xfer_in(s, ep, p)) { + switch (aspeed_udc_ep_xfer_in_desc(s, ep, p)) { case ASPEED_UDC_XFER_DONE: e->pkt =3D NULL; p->status =3D USB_RET_SUCCESS; @@ -671,7 +671,7 @@ static void aspeed_udc_ep_in_kick(AspeedUDCState *s, in= t ep, uint32_t val) * buffer before), copy its data into the buffer now and finish it. If the * packet has more data than fits, keep it parked and wait for the next bu= ffer. */ -static void aspeed_udc_ep_out_kick(AspeedUDCState *s, int ep) +static void aspeed_udc_ep_out_kick_single(AspeedUDCState *s, int ep) { AspeedUDCEP *e =3D &s->ep[ep]; USBPacket *p =3D e->pkt; @@ -681,7 +681,7 @@ static void aspeed_udc_ep_out_kick(AspeedUDCState *s, i= nt ep) return; } =20 - switch (aspeed_udc_ep_xfer_out(s, ep, p)) { + switch (aspeed_udc_ep_xfer_out_single(s, ep, p)) { case ASPEED_UDC_XFER_DONE: e->pkt =3D NULL; p->status =3D USB_RET_SUCCESS; @@ -727,11 +727,11 @@ static void aspeed_udc_ep_write(void *opaque, hwaddr = offset, uint64_t data, val &=3D 0x77ffffff; if (FIELD_EX32(e->regs[R_EP_DMA_CTRL], EP_DMA_CTRL, DESC_OP_EN)) { /* IN, descriptor-list mode */ - aspeed_udc_ep_in_kick(s, e->index, val); + aspeed_udc_ep_in_kick_desc(s, e->index, val); } else { /* OUT, single-stage mode */ e->regs[reg] =3D val; - aspeed_udc_ep_out_kick(s, e->index); + aspeed_udc_ep_out_kick_single(s, e->index); } break; default: @@ -895,7 +895,7 @@ static void aspeed_udc_ep_data_in(AspeedUDCState *s, in= t ep, USBPacket *p) /* * No IN data is queued yet. Save the packet and return ASYNC * instead of NAK. A NAK would make the host retry slowly. - * aspeed_udc_ep_in_kick() serves and completes this packet later, + * aspeed_udc_ep_in_kick_desc() serves and completes this packet l= ater, * once the guest gadget driver queues descriptors. */ e->pkt =3D p; @@ -903,7 +903,7 @@ static void aspeed_udc_ep_data_in(AspeedUDCState *s, in= t ep, USBPacket *p) return; } =20 - switch (aspeed_udc_ep_xfer_in(s, ep, p)) { + switch (aspeed_udc_ep_xfer_in_desc(s, ep, p)) { case ASPEED_UDC_XFER_DONE: p->status =3D USB_RET_SUCCESS; break; @@ -931,7 +931,7 @@ static void aspeed_udc_ep_data_out(AspeedUDCState *s, i= nt ep, USBPacket *p) * No OUT buffer is ready yet. Save the packet and return ASYNC * instead of NAK. Writing now could use an old buffer address and * lose the data (for example a mass-storage CBW). A NAK would make - * the host retry slowly. aspeed_udc_ep_out_kick() delivers this + * the host retry slowly. aspeed_udc_ep_out_kick_single() delivers= this * packet later, once the guest gadget driver sets up a buffer. */ e->pkt =3D p; @@ -939,7 +939,7 @@ static void aspeed_udc_ep_data_out(AspeedUDCState *s, i= nt ep, USBPacket *p) return; } =20 - switch (aspeed_udc_ep_xfer_out(s, ep, p)) { + switch (aspeed_udc_ep_xfer_out_single(s, ep, p)) { case ASPEED_UDC_XFER_DONE: p->status =3D USB_RET_SUCCESS; break; --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067870; cv=pass; d=zohomail.com; s=zohoarc; b=CFwGh4IkfO6g944X12Q+Kn9HMIB7CZUroW7TZw10dYr98OsCs0umbWzZND6/SzTsVg76R2pPwiwpvCojYfc1lNw6LWqZkVdPTQPDKIYT+/MV2YNzx5o6UGeC66rO4qdhMApemlfLmSo6/W2Yp9tvz/e+nYRObUE6AxpmwAxdmoI= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067870; 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=+OoA0ur52k8rY6wNtRkAlKs6vLV9k+GzTYiZoeijQJk=; b=PCWPCFrqYfebXbDqRpptM9QCGZ/UmxeEDFzP+3EDgZq8IHBsF/Alkkw6Wp69nI3kbQkX3V/hmt70/JhlALwmkYZEg8mkCHeA1+dCQiIzjTBhBoKzlwiUbK7lLYjAE5dF8gLlCSkPWC9ZEJ2aksXSs4CbEdFtIfZD/nR6a2DjsD8= 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 1790067870142894.6100577637036; Tue, 22 Sep 2026 02:04:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOS-0007bE-0u; Tue, 22 Sep 2026 05:02:28 -0400 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 1x8wOO-0007ZZ-AR; Tue, 22 Sep 2026 05:02:24 -0400 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 1x8wOM-0002CW-LU; Tue, 22 Sep 2026 05:02:24 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02: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.0428.015; Tue, 22 Sep 2026 09:02:11 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PGrFICWSfogsnq9P9KKs+H6kx4nJYipaKDZjjnWfu1Pob7oQrgl5HHW57G+z6Sd4LYVN8TNRH3w8RbT94gAyt68CD4qbtiiDNmu83p7yGELZxGsGvTiV+hK/tSPbjQHMu0vo3nGElCTB3whZChLJnPv/m6FFU+BvGhRdnIUzPQ0siDvGWQNnfToImyZ7Y9sb0gXfFPpVKUfcYCJDLwMZll8wGlzegxwGeQWf07nEPh87o8NtwgNNt2Jmdoxlq8y6or8bJ7YzKxk93UQHnVuSvLsBdLfrKXXwhLvuEEXGl42Eor0g4qkDit++gcmOn7tf5ckMlvAFslhlb5ywK58Ykw== 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=+OoA0ur52k8rY6wNtRkAlKs6vLV9k+GzTYiZoeijQJk=; b=q7GuIKf2XUzYUsf8xCRKK/bNRKXlPgcm78kR9hf2DEk1IODekQJuV4BjmlPl61oRgNr2jMf0aXIhnt2YCd5gOzGKagI7vR063n9mvnMEBjtVkfil0WOTWnO4/NKYz0Gy4ZrYX2vexlu70glf470pclortMPOO+mmKnWuaWIYNg9qM8argKNtkFikUAZ1audumR5IudTXITAcDcBJ9qpk84TkU9vZpLv690F/WFfWiiUBcJVtSlStpvBHLyqR2rxX/IOMvKw3hiZA2Ct7HZSbONwQftjImEIoY9YIl4WmuCxoyXc9wgsRREPdAsCp+8Yao7TEHyO0YthVzSYkqbLVHA== 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=+OoA0ur52k8rY6wNtRkAlKs6vLV9k+GzTYiZoeijQJk=; b=Xps+KB3zdtwpQZ0AR3EVavqN3KWIAqVEPfqQgZY2ADspsgL2QeWvsyD9OyDvUM4bLNahqySMKjnB2dnifT+vR4T/NLcodXqXCHZyk7r4Ln/CaCHiAtzpFe7F924x9MrURSlToI56Qxx8O15enomWWvnNYxU4PB5RqLkwX0+xjvlldMXBBmnlDXb/VpJtecOelxPN9N/uw8fFmqLWw9+MrfMESs8PDVjCKg+Xu2YIlHTwV3+HTjiwHQcbWuyK4vU7eA4zrZjZ2DCVEYnpHWc8EVDHHDLXzCRK4PPQ6Uu8+0Jqs6S8rod8QG2M2W8w+27Kx3etTyYMwOppsY6G+NEddw== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 13/19] hw/usb/aspeed-udc: Store the EP_DMA_STS write first Thread-Topic: [PATCH v1 13/19] hw/usb/aspeed-udc: Store the EP_DMA_STS write first Thread-Index: AQHdSnEOK+bZBA98i0WeQU6VecQx+A== Date: Tue, 22 Sep 2026 09:02:11 +0000 Message-ID: <20260922090154.1792077-14-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: 01040a21-7f52-45f8-8d1c-08df18883087 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|5023799004|56012099006|10067099003; x-microsoft-antispam-message-info: uTdU0j4tcuFWR6a2Y3LcuvsamFsTGwGqami+Oji+VXGzoiZPBbrl188VQofP7BYbiUjq9F85/kRjreX5PrqmasH+vp2bodlG51XlOaEglnvIyxIikcKvYJyPcjc5C431wMwzv9s1fOZ6PKxAHMPFXazajfLgbjOPieMOT7/Cf7qJgkM9lc+VfTqS3HQSuGV+rwjQcdTm4fAd18eGMXnhK4RQ19Xos0phAqOfKeuZKdzKPZ3hhWMF4BBhcxNxVoq/e0SEY/uvCrZwWrT6GPWsZOq73b3A+dzqU3NFshCzpLaHvEHzhmBMsmhAGw7mumXq5sBnA1vpnGbnSbyocJcQPQenpMHP0qq71HYhy9he4FfylSBdXcQwlD2ogAkB4zzGwA+in1ZBh+YNjMXp9i2EpnGBG+DEfDD1o55/xNR9ykDFJ4V/XS6o6tnt6pUXOnPc3t50MD/fExgBdIrbPYorNAS6Kl2LzLC1Q9xFdguXualYMaJ9J8bkLisA95ZFtXxdUEDM07RlT5f2hNfcAkOmovzD0uMzRA32NsA4Aq3V0hWVHYnFTdjv6fPvd0ysTgHBmz/L6IUMqAhc26ApTzpHj3HSltTINUWdHDlDYx4bHAaPlILLHfggo1LEPyY+Iapapy/DWmWI0XXsxjoXWPai4v2f3eRFKg7OL8kI3ge62p4acdhmXh8GhY4imt7K4/dk11B5YsRYszg6HkEE4KFEU81TnENZ0odlMDgiH4sXgzo= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(5023799004)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?SvwYKbGhJSFAYo9YgUSagHqolakidyI4srT/1ZzUD003s+fxaSs49qe8ee?= =?iso-8859-1?Q?QpH/o69IP2qFx4WdOIe5uv+DNpE8CUw4tc5TKkHgZ4+iWbbvLIf0BpEeFm?= =?iso-8859-1?Q?3mr/XJ65guSSwm9XPtaD/mUJB8nG9gerqPtvEzWrC2Wcn2a8ADgtZEUGN0?= =?iso-8859-1?Q?ssnmFkvPWmjh4oEnIISiqyugfOGUfyUybP+Wxc8Xz+SNF36MAbrpjZabyE?= =?iso-8859-1?Q?mgz1ID05SEpJZg60WsDgUjbUhLpzESCR8KhMziupzrZT4mdN2myyq8JpfG?= =?iso-8859-1?Q?8BmgtLrnfW2F/LzQJvoMt6d2gh43cEOiHQlc7VppX0rV3qwjTpQF1ucWOA?= =?iso-8859-1?Q?j3pS4tqzBu2Qsq+WEtwNC6jKlhpJygsd10pEoUwvT4r2f+6j8qImsVCTsS?= =?iso-8859-1?Q?K/7Df28kthkJO1+KoQ65i9DapLnmTCdXEbnpNQ9KM80aOGxqzVD+CZ6qsf?= =?iso-8859-1?Q?aXO5b7E8nbXT16kDQOzT3/O5PLJn7m2SJyv2NB+DWeaGCTQOmkzEUjkDCP?= =?iso-8859-1?Q?5Cndt4f4lepxcemEl0WpJ7dlC+ySqNh2hNM16i9b7kF1lOhDxLU28qEgyp?= =?iso-8859-1?Q?XEJmBfiCSBe5MPD2fi/NiFmM65S6RV0Tj9hjKZke+djIyj1mwY9dpWPKMZ?= =?iso-8859-1?Q?kVQvelul3gjPrLpGHShXsy+kDcmWuAb2mJswYDv9XdNRtkrpD2a1ufuXtM?= =?iso-8859-1?Q?glMhXKDWnd3m/LLB0FY5mWx0gyOiLrqqylrCOBDRUc8Nex/22gL0/drqdV?= =?iso-8859-1?Q?6fhC7ZjcQoXxWX2r1C8nthfmEHj4nNg5ptjNAO5RWkDVVcZ/3SPYFS02Wd?= =?iso-8859-1?Q?ft6zCSfc53aeuytNWMjoQWRuqsoABSm7IoR3ffqZ31nCroYhnQK0ByWAg3?= =?iso-8859-1?Q?u6W3QziyhkPrGBUWQY4wib+PwQNVAkm4GQn0exNUm72YvC6Um6GoNbzeLI?= =?iso-8859-1?Q?Cn8u5khjRoAFxOfjo05gpj/kfHcmvuZZ5LAwfbTcfvTB3pQv5WKMB1Gprx?= =?iso-8859-1?Q?OpeUoEfaF7WAB5M9Y+VRynMvOliLrt3amXJWgW1rJJrUBM9bBFFD/CAnUN?= =?iso-8859-1?Q?Digfsb3qJyvkamAZ6cJlpExKQ//xOwQ5LLusMClRwAn9yXQT77Jtqv4gFH?= =?iso-8859-1?Q?qlln5VHs8NrQOXq14giWA07NbhE0u/KUBK0cNO7GtN/rJCtkmrs1nM3Mn8?= =?iso-8859-1?Q?v/pfyJNsaOirnFTVpci7qRD5JJh3ZHZtIt6Mgr+B9utwwq+2xCY0N5ppyF?= =?iso-8859-1?Q?xOoqlUY+pNoxrye3u1UF5oGI8rWleqID1y1/x2D7xR3ApWXlg8Ptk4Oe+4?= =?iso-8859-1?Q?Evmtfkag/ExXMEDNEP7j0Q14gtKmBVUEE5NNhFEGz4UAaUE8F7fKOATEWx?= =?iso-8859-1?Q?0pSy8FNcwl+sbZoK2M9UBMVpwGYcx45yJBtUgk85snwFn5yc/br3efFY58?= =?iso-8859-1?Q?IiQpNIMcaDmaYtOZ7Iyr3Tt1pzJdrp6HC+EE9dbY33JKdrFpXNIQ7puSjf?= =?iso-8859-1?Q?uQHPCX0j24ek8p3gyXJFkNcnEGbK0mpPFoYlzLoa3+4pVDJg21VMmqGrWI?= =?iso-8859-1?Q?aahY0nUDitiQsx2jut5zf5luC2pMR2Iw0Y7vEzROtr11oZZWZFUaSOrK6p?= =?iso-8859-1?Q?b6Wzfq/lS4e+H3SXNMWsI99T3BWkrhzcoQaU7jMdW587AdRC9zflL9iicH?= =?iso-8859-1?Q?vOjNnPHQ/vTihuT1yjTA/C+WJQVTkPvRbK/neCalPLrV6ji/eF1Aj4us0Z?= =?iso-8859-1?Q?9AiY6rIBFjOI6FeDfTovi6XmdYbPzTzTDVHGlrcC0iRn5e/IhtVaSohIYn?= =?iso-8859-1?Q?N9xvnP/tPw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: WCGGSMSiN3lmS8BqZi15+p9EwuxR+svh+Td9Q75kWgSHAMTvZw1nNCLYUHCetpQsCgb6lmbZB1wQvwmGXaz86gccVLYlkv8yG2iaUiQdVWHoXdgF3o3sqcaILYXkSYjRWp0Bnhg/3XW8pG9cRSApm3o1lorl3scz1QFPjpmJqaMpoxNbqLHv/0splctHzXYxsVop+F49WyoIwR7WQ2p9vDeHMJrFBW+3ACYb3LQcLc6f3Osbx1zHOqiH+nMU/XDsvTBOWf2g33JvgLPsG4Nnxg6VxtC9TbXQylkk0mbzR4kP8ya4uAP/i19xA8Fd5NjktR77BDTBeeO7q8aQu4Dolw== 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: 01040a21-7f52-45f8-8d1c-08df18883087 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:11.8266 (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: Y+Y6qiIbvLc4Oxxa+uBd6hf42FAiAQ7d0xI4bH8j20KWcaS3ljmwzzqeJHvoXrZ9mN24isQmQ01aYQQsQWw/T0idqLT3lFYqjCRT24VzSws= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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: 1790067871621158500 Content-Type: text/plain; charset="utf-8" The other helpers run after EP_DMA_STS is written. The descriptor mode kick did not: it had to run before the write, because it stored the value itself. Write the register first in every case, then call the helper. The order is now the same everywhere, so a later change cannot go wrong on it, and the code is easier to maintain. No functional change. Signed-off-by: Jamin Lin --- hw/usb/aspeed-udc.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index b43f077c2d..4572914e16 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -619,12 +619,13 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_out_sin= gle(AspeedUDCState *s, * If the request needs more data than was queued, keep it parked and wait= for * the next kick. */ -static void aspeed_udc_ep_in_kick_desc(AspeedUDCState *s, int ep, uint32_t= val) +static void aspeed_udc_ep_in_kick_desc(AspeedUDCState *s, int ep, + uint32_t old_val) { AspeedUDCEP *e =3D &s->ep[ep]; - uint32_t cur_rptr =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, RP= TR); - uint32_t new_rptr =3D FIELD_EX32(val, EP_DMA_STS, RPTR); - uint32_t new_wptr =3D FIELD_EX32(val, EP_DMA_STS, WPTR); + uint32_t new_rptr =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, RP= TR); + uint32_t new_wptr =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, WP= TR); + uint32_t cur_rptr =3D FIELD_EX32(old_val, EP_DMA_STS, RPTR); USBPacket *p =3D e->pkt; =20 /* @@ -641,8 +642,9 @@ static void aspeed_udc_ep_in_kick_desc(AspeedUDCState *= s, int ep, uint32_t val) cur_rptr =3D new_rptr; e->desc_off =3D 0; } - /* store the guest's write, but keep our own read pointer */ - e->regs[R_EP_DMA_STS] =3D FIELD_DP32(val, EP_DMA_STS, RPTR, cur_rptr); + /* keep our own read pointer */ + e->regs[R_EP_DMA_STS] =3D FIELD_DP32(e->regs[R_EP_DMA_STS], EP_DMA_STS, + RPTR, cur_rptr); =20 /* nothing to do unless an IN packet is waiting and the ring has data = */ if (!p || cur_rptr =3D=3D new_wptr) { @@ -715,6 +717,7 @@ static void aspeed_udc_ep_write(void *opaque, hwaddr of= fset, uint64_t data, AspeedUDCEP *e =3D opaque; AspeedUDCState *s =3D container_of(e - e->index, AspeedUDCState, ep[0]= ); uint32_t reg =3D offset >> 2; + uint32_t old_val =3D e->regs[reg]; uint32_t val =3D data; =20 trace_aspeed_udc_ep_write(e->index, offset, val); @@ -725,12 +728,12 @@ static void aspeed_udc_ep_write(void *opaque, hwaddr = offset, uint64_t data, break; case R_EP_DMA_STS: val &=3D 0x77ffffff; + e->regs[reg] =3D val; if (FIELD_EX32(e->regs[R_EP_DMA_CTRL], EP_DMA_CTRL, DESC_OP_EN)) { /* IN, descriptor-list mode */ - aspeed_udc_ep_in_kick_desc(s, e->index, val); + aspeed_udc_ep_in_kick_desc(s, e->index, old_val); } else { /* OUT, single-stage mode */ - e->regs[reg] =3D val; aspeed_udc_ep_out_kick_single(s, e->index); } break; --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067969; cv=pass; d=zohomail.com; s=zohoarc; b=Y4DOXSUTlNu0arP9+CqlbzuGpSxcfrTYmDOklBG4fqZkC09SsfLEJHBf/P1dSmvP0aTm3Dz8fPTSLOKEVonicv8xj241J5bMFsl1yJBay9bbPX5vmXk7isc4yKJgAX/JYyEA34NDr/Mf5HV7bDCiP3KPC80mhNk52wR5vOIBQq4= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067969; 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=tvu2pMHkc6dZYHrkpyvtL/QlP3wxUIYfDi0Y0W2Zezw=; b=nhwVqrOKlktF9Ke2OO0kcB3wMGtPNlQa71WLzb5FPHQP9uZUtnQ4NvMa2n/BZiqKtJzAj5bmsSzMErl2iwlUT0N3xfB+PGlgsYf7RPxvwyRvntOpP3V176WgSItt5pRXZkqky8B4Ygts6J4q1i3zcTJFDiNYDsujVpjKWuYsZmg= 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 1790067969217636.1918910767195; Tue, 22 Sep 2026 02:06:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOR-0007bC-V0; Tue, 22 Sep 2026 05:02:27 -0400 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 1x8wOQ-0007aN-7s; Tue, 22 Sep 2026 05:02:26 -0400 Received: from mail-japanwestazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1x8wOO-0002C2-NG; Tue, 22 Sep 2026 05:02:25 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02: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.0428.015; Tue, 22 Sep 2026 09:02:14 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kaQb0PnoZF012fCoNeZnKUnGF9ejwgus1ojjIVSbuMlaPklLXvpcYg9V1w/MP0TSbwiOX5rtv6YPesPlKSp4wsHyRkTyA05seiq/NysvpSwSO8etljkYlpaWO4/EzQ85sOyqv2hnj+nHDBZf19Z4ROFl/WG/rC2wAzglPsORsdPQhYg25ziWesUb2hWYtrrtQBfO0KYut6c9AMsgbIFHkd0N0uhut4k/Eupg7WYRGezCt0weOoKXbJLnRXY7NTE5rCso3vsJk3Mi/4REhWOONrUj/MaWDh8KO3yosLWThh5H8T2AMPrKN6T/bUMmJ1QeVFu3lu9Mzq75zQSibfN76g== 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=tvu2pMHkc6dZYHrkpyvtL/QlP3wxUIYfDi0Y0W2Zezw=; b=gJW9ZBJzcIOUcaOc5nthbdngOMUi4ndLsuo5ZDCLm4FzLH+QA4hM4HEGmebLuP41HukYGLTz5JGgAAFRahoRvE65wZ9fJPzzXoqkYN+0Kntg2/wIkduIpQmbHXz2WHi0jcTAzSbPFoqIgXwV40tW0w8fI06iMHqJi5NX7DRMg6XGm+7gO4H8xaacq7Ur40VHMgGAuYCb+WAzd7gEzMa7Eyyaa/6vBQ/syMH4VlEhQ5R1e8SdhrDItP/rNu7OPJ/FhpoeOtZuibTi1JmC697b9fIebQfAS4G9JG1YOAW9bV4jlUIegR1LhSbVLXq82UCDRLKiChutVQE6KRKUiOViRw== 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=tvu2pMHkc6dZYHrkpyvtL/QlP3wxUIYfDi0Y0W2Zezw=; b=qaZ/wpPaZMaXSHG6DH1tcolAjKnjCCxMgiZ1FEBtGycFJxV9yCfcfq/WN3hJGbUwv9+xHGkmBR9dUgMFoq1dqCzjXKZICEk+8PyKc4oXTxbc9l97qtE3gHKhJRTz2HDlQID4KAWZAdTSpvS5TUbfxHnE/VOCA/w5JT/+Pyx9ANgtz4LizfqveNphHKo1wtIN4IfRwujiOdUC3eL6+gBN8Wge7WMusq3h58fVJmzr78l4XQvWgz4nykocM+EwOt+5Pv1ZwfMG4TE8cngM5k1UsHLK4kfxgx+Xw/eYZJ13DW43G4VnEQeaVNsKLnfZrSuRZPY0vTpBZ8+lreyEo5Dzrw== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 14/19] hw/usb/aspeed-udc: Pick the EP_DMA_STS path by direction Thread-Topic: [PATCH v1 14/19] hw/usb/aspeed-udc: Pick the EP_DMA_STS path by direction Thread-Index: AQHdSnEOSxNfqx/jzk6omvXAeKQTJA== Date: Tue, 22 Sep 2026 09:02:12 +0000 Message-ID: <20260922090154.1792077-15-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: f716aa3a-736a-46f4-90e7-08df188831d3 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|5023799004|56012099006|10067099003; x-microsoft-antispam-message-info: 2vkmTxs4lGmaUpGAG206Lt8A9ctQ3i/OIt6kYsuRUb6Rz+1MG3ikxnXdwR1ghViDysDce6/7dKOo8nOQCEdqvuD61EW7NTxopGY5B58XnQM49gEzBM1fs0OaSJoVIjC5CJ7JDN1MeiwE4OqDrzxy/u6FTI+E7lWxxyZHhhOcwnovZWWPEoL4ZQyy1Ym54rokB3xfa5EdfMQu5whC9zCwZ+BBm6YvVqI8UnNwtiJs7WGzfQXR34IEzka2UcT+h07T+okTXXSKUolfpoJr5aQ5Tuqe3rNnxLBBwVaQi+Z/fI81+kAWJ3PqIlIIeEUDIkXtW5XJKUfqEyGfGFtxZVo/LzotqSYP6b7xZ65lIcU5/fppTvc52AQhnX56SXKGMkUPPwO8x5En+Y7/0QBgMxwZHAqAOYiIBI9ZeASvG6SaNgaqguD1YyCWu8ARuKkbwqVc1KbfkkTu30ZqUAwbWpYhBj4MbEDJPLGU+AguQZ7xQwUqQNGNCP5ZKsqyjxommDvLuHU8c80ScS4v7lcBI92+sqQWmUzpVDnM/NHEPvpez+rgGzPgO7gmnbS0y3cII9pAbsgULMZuzVdblfx16CxpEJWfs6/0cpxJOWNVuDY5FA5CyUNwtUFcplcecqX7L1o07fQrmrFxOhrqG1tRasZrp91nX5z03XrR2E6qUfHJIZniDAOKWFj6qOo/gIzsdwBaL8xToGg16VtbRKzY8Gm03JVL/eX4BIhwOB3cMbwlWf4= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(5023799004)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?B1sNhxOKVU6FMsZsQoDdzDPGa88As3qmWxAU2Wd19cfpm7KH5McanaMAEj?= =?iso-8859-1?Q?xnVA5xhi+iLpcX9kYhNnGuA5uQo+yzATqqSTVl5cR4115p+nKaoFDuAvlW?= =?iso-8859-1?Q?vr8VIJL5HV9WwvDWvuKXiqQVl6tutqHp7z6GB9vy7EmwFdeR3/aIilYtSS?= =?iso-8859-1?Q?9+cVEuX56VtsjwYFA9qaLqG1FUZiko67AhW35jhXG1rrnzCgkZzLbR5+0P?= =?iso-8859-1?Q?klzQ7JwCRsqKDoC4LgKhVfUeOU4Mp6HCSXDw+Xex4gxbXcL+Y0aXQ+meRK?= =?iso-8859-1?Q?iCwxniyGhlXTe7qRsKpm5dK822pFx/i4lzVZ7CUYrPlN1Mah7s89pPxRZl?= =?iso-8859-1?Q?JIMabQBRkkjYW31jaaOBHcZZA7zcEW6zlACWeklbFAYmJyT143eaUwb8IU?= =?iso-8859-1?Q?hG2rkSvCEQ+dadzWSosN4Mkbk9NoPgCqIs4o+07gQ0KJy7/Z/bHFxRKjlY?= =?iso-8859-1?Q?V4XmXPOafq5iEoIAPiIRY6iesqwc4modNuvfQHr1Smx2Rn/5l0iLRBc+ZU?= =?iso-8859-1?Q?BEw1EAbebBW95Cvr0eE5rMH1fbDsC/tpqNF3DDTtaH1qStZJ/YIG5pK1d3?= =?iso-8859-1?Q?6/sbQrbRKUnctjl6CCf2pahnu3bu9z+EFHdOBGjQiI22rnRO4oSkS4o4lh?= =?iso-8859-1?Q?gDEP1cbT+JWcfzArr327vztDX2rZ/gjJeL0ca9IjirkZTx92WKjevhSyc2?= =?iso-8859-1?Q?mwUJVx3Zw6KrTxXvjf+qlM1z8is52m5GUBLLWKz578HP5c5rq5aIsTteQB?= =?iso-8859-1?Q?PRQCBEXPjudwVPwBLGCDXWhoXLmDW97sDYGgC6WsxGpH71UMSm23jHma8S?= =?iso-8859-1?Q?q4k3/tqdQeuQZNmLVOKYd2D0usKL1rxqq1TF7ZPjyC7qtwJVfKwvWrzcAF?= =?iso-8859-1?Q?cD5OiUHGo0QRCZ1QQNOcw8Kk9fXUBMrKyXEw4I86yb8LypbS9Fud0ue8Mn?= =?iso-8859-1?Q?JbKtv7hyNldkoYsyRm6DhmZomSdiSREt3aagDpVR22kgJdlCj1P+Zk9632?= =?iso-8859-1?Q?5BSWcogDOg/fOJAl4pS2WyjkKq0/EYRE2m2vebLnpE03ma3dO/l8sYGo5t?= =?iso-8859-1?Q?eaT53i5GkX6V1CtB4DQch8aVw+iLbDOouT1j+ocUvODo1NvCknp5wpZ+In?= =?iso-8859-1?Q?7kmxeNXMR0WEFRT8KxrqdQGP14Y/a8Dg7heEj9xeXLn6hVsMFJp3m+JvDA?= =?iso-8859-1?Q?lPy1G7IvuOSSLRHzqO6ORnESJGEirqsIkA0P/vuKXHiqeQ0qMDnHVoBJGw?= =?iso-8859-1?Q?TTSi0pcyZIvHk/Rs5h+IP6J2C8vuR26osGSR/oSQA+bgltSsJhf0n7uWuH?= =?iso-8859-1?Q?ogr8BQEp+fwWIN+MQ0jBhpXY7G2uS5joGKns4ix2uDCguuU5Rgo+hICMEi?= =?iso-8859-1?Q?MTwfqD78uBNYsugL/CXtQ20wQQmkkFepGHPqKOghz29F4oJrysLe6ZAUb+?= =?iso-8859-1?Q?OdVr8fSp8gG6/GsPczAk85qsBsR9w/Z69waf01HeMMvq3AZv8Dn1NHntjX?= =?iso-8859-1?Q?/P/Cy9SlDuSVXKQGjvZLL/4L2LaOT1EdHcjJ3CErYcv0yzBSgbcuqGXsSO?= =?iso-8859-1?Q?DMgmD4I3WsJ0YFGnk4Q1haq6JLiYTJp1wCDppj86h/W/V0vfxy57s2QXTO?= =?iso-8859-1?Q?NvAK+1yjRxXy6/yywDXmhUeNF1AdAU0nnqb9b3VG9yZePPxXJBD2fdfkI5?= =?iso-8859-1?Q?Dw3P41uRgH5zSQpTxvSp0kXjyymcuDqkVOcsZdLdUG7ITd1MqYCiLl0kdc?= =?iso-8859-1?Q?b+phvR+Uwx0s+gkGpBZLidYnsQruC4GvmQQ9VuwMl+03z3C6y51N3Ax1fe?= =?iso-8859-1?Q?GgyPyiJTUA=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: B0Nie0eOAA/Zh36ikYq4wiFgPIcEvxyYg965QrvrYDIcBf2wwuhkZY0aEo2b2oikW6i6qY/VaZAutWbR9vhpfYew/d+nCqyvI0xWxh/hL236/Bhx79Dt6q/fxaGhNpZP1Oe/XEGMKlv2YXrTERFHIMMj0XnvT8+o2Jq59Tm4xWkI3sqRqnslcTI9J8PYHRaj7E4hrfLDl9Sry6kstxdyG5vO1SJIYtQ0ypfIVCtC+KgsaLjGy1XYH8YerVhpN9w1aH+WN7eqixL8T6poELyOqu9c/xWASyieVZpgNt9z81/0fX2CXEJjMV1LjxZieFL42MnUJc3wNCThEp7bNM1glA== 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: f716aa3a-736a-46f4-90e7-08df188831d3 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:12.9941 (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: BhpYzQNHmU2+l8XyPE+JWMf+txYLGyzTKoQBiD/fGFyNpYlRMEYGKxXYuc/9my/kIaQ4Vk3Tg+fmCh1ujUoP0UL9qxabrEyPSKpDoD7W5Fk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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:c406::3; envelope-from=jamin_lin@aspeedtech.com; helo=OS8PR02CU002.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_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: 1790067969981158500 Content-Type: text/plain; charset="utf-8" DESC_OP_EN is the DMA mode. It does not tell the direction. The write handler used it as the direction anyway: set meant IN, clear meant OUT. Both directions support both modes. So take the direction from EP_CONFIG.DIR_OUT first, then take the mode from DESC_OP_EN. The model does not support OUT descriptor mode. Log it as not implemented. It does not support IN single stage mode yet either, so that path does nothing until the next patch. Signed-off-by: Jamin Lin --- hw/usb/aspeed-udc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index 4572914e16..c48e2c5f1b 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -729,12 +729,17 @@ static void aspeed_udc_ep_write(void *opaque, hwaddr = offset, uint64_t data, case R_EP_DMA_STS: val &=3D 0x77ffffff; e->regs[reg] =3D val; - if (FIELD_EX32(e->regs[R_EP_DMA_CTRL], EP_DMA_CTRL, DESC_OP_EN)) { - /* IN, descriptor-list mode */ - aspeed_udc_ep_in_kick_desc(s, e->index, old_val); - } else { - /* OUT, single-stage mode */ + if (FIELD_EX32(e->regs[R_EP_CONFIG], EP_CONFIG, DIR_OUT)) { + if (FIELD_EX32(e->regs[R_EP_DMA_CTRL], EP_DMA_CTRL, DESC_OP_EN= )) { + qemu_log_mask(LOG_UNIMP, "%s: ep %d OUT descriptor mode is= not" + " implemented\n", __func__, e->index); + break; + } aspeed_udc_ep_out_kick_single(s, e->index); + } else { + if (FIELD_EX32(e->regs[R_EP_DMA_CTRL], EP_DMA_CTRL, DESC_OP_EN= )) { + aspeed_udc_ep_in_kick_desc(s, e->index, old_val); + } } break; default: --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067854; cv=pass; d=zohomail.com; s=zohoarc; b=cOpmb0sxkNfAI+B6z2OnGuB4S76zQ9Po1Mph+SDLtfMA1O1/J1CXmunRjSvSpeJImzsf1KSIm2zd+LI+BBYCBhfOcne+Orl5DZd1jsW1UqFq8mZLkW5XwQG/DhfUxAkUEKns+xdylK4Me0oLm1UVU1SQ/INUCNv6OIH+dRwXaGo= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067854; 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=pHNcaI2SuXpm1YHTioqdDUpzNLbqZV7kd0pVa8rreq8=; b=Hqu8cPofQ314C2EI5rQgx16k0Siu73uRzNmfimGaZhqWAA4Eg5+Juvsq/fPDSHBXkqyXuAPgB2p/bw004bXwSvERy/gpuWGxgChyqn/0Kzrs/muZr2GrdR/cj7+TB17w1VVcWR7YBbsVkkDRiNCYiQKvfcoTzjytIN3R2aLzRwI= 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 1790067854227508.2154664486417; Tue, 22 Sep 2026 02:04:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOS-0007bQ-Uc; Tue, 22 Sep 2026 05:02:28 -0400 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 1x8wOR-0007ah-6X; Tue, 22 Sep 2026 05:02:27 -0400 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 1x8wOP-0002CW-4X; Tue, 22 Sep 2026 05:02:26 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02: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.0428.015; Tue, 22 Sep 2026 09:02:14 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=H8fDK/hl95Yt6K0+QkSM44VGJtSgqUSRqXVvx2a1l+KffRjf2Zdl/MX++fy72KU9dbViIqJJWKsS4Fg/NLxY4QFMiwnzsUcExEvO7BG7RZu2Y+hNodDSAa7qbvLvdxbCsVv6Fcv2EGo4Xp41oTUduW9+G2atGuadRcYwEe6Vx/xluqD+rMUMm9e13UCMb3yV3lPaHxiE0OByyZgXY26Ku2HwybNT/6KXtlxOb0zo19+A9ga640yZ0II9w3DiHHDkS63FPJdUe7iE0LGfY+lV/iCjj+bYmzCR69QdKEHJgVvBIuJaT/YtUzFCW/A2xrLxIZB0dMGDWJ4xfDXyukGbeA== 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=pHNcaI2SuXpm1YHTioqdDUpzNLbqZV7kd0pVa8rreq8=; b=eBmW4pFIyeOCm4Q0ePIJbsb8XlCJfIaL4A0c7vvsrYG6XLdCmJfH3CrsbmsY8mLhKp1VgzvUrEypI1tKAELqSguPRxZL0yqqmg6ZHioK97+gNF0YsvGxrircJ5PVvIxKcw7Es9ACqDbe+LfX/6W8ECitKfXimTBCZTGoMTAR+G8+AqjlOF0JoHuRT+h7SaKQ2tWtDQDvESQ4vXd1LOpraVkBmU91cmkKkAOaN0309qr3wBbOUrK4iFBm6anHaeq5wcNl6Qk6FLScFWGjnEWPHFRtG8NGlAxttfg9oSD2ovnHj3YRiUw5aO17EFmsGW2VYHVnt8IMksY58xqgBOa59w== 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=pHNcaI2SuXpm1YHTioqdDUpzNLbqZV7kd0pVa8rreq8=; b=eMbXDXWwqYgVqj0WtzCN3nP7S0zgwcHFqW/Lmw1vS2O2Ss65IAG5qExhMItS0lnu9BcNvrIbeC7tnaEPcKJ+6EN1R9Pn10nQOPpA9+METx1wRs9APR2gJQbhbS11Qb6C6OFgPDYE7zg5MsZ7bqsiKcNNlVKulXSaIIUNAncjcgAMVbCH+gwl/1+A3FPg45J+wyoMOqAJLygFTbm/jKkuy2U9iGq3ekh+7lpFbq4Lrv56OSbEW9V9CbWf807EhRZagBIq6FH/ccnTsrBC67y239COH3yR3VqB5T+zLRFtPr0ZjE6Ggd+DM8M3R6S7Sn4R/UqyQSp04WWStuBvlkrLng== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 15/19] hw/usb/aspeed-udc: Support single-stage IN transfers Thread-Topic: [PATCH v1 15/19] hw/usb/aspeed-udc: Support single-stage IN transfers Thread-Index: AQHdSnEPhhIdLo/LXEqtBfZXKYA0XA== Date: Tue, 22 Sep 2026 09:02:14 +0000 Message-ID: <20260922090154.1792077-16-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: e64851c7-5b01-4b4e-123f-08df1888320b x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|5023799004|56012099006|10067099003; x-microsoft-antispam-message-info: xB+rGkn74vDMV3ei19BA3B6LSuWYjX/m8ST6AxPPNzLMjc4QLl03mop1oMAlDByJJiOMiGs+iHjAdT1RL8g9lk173ucFjkeCwFzrFMeOuEDYbGfQGRn4/iwsP6uTH0+wtsAD+lO9ThSahQ/6JG04uJFME61E/X6Drv7PVXXzNpxau7VMbK+kHep/RhobMT6uamHYzAyiXKVisIS0oxAAFhRuWFY6BxJN9WVLnusTYSZpnD4fiKq6o9R1IC66yDTKAEPVxb0ksk6kbP2yxKyYlXRCRaytsSr6eDnbfDFhK/+qB1VIXjqwribZ1gN24bmknztTDQJ4JnY7xzxB77sdAaoc0z6lf0dQniUQ+0e9Y5bz9nY6SZhb5LS6/UzLY6m/8gn4xZpHHYs6bn3vSicMF41h564gSA1zjqDDdjbuISRvyDXPVu1FXYoM1T+Vv73TXzgmd1O3tJl5qBxeCyyBag/7eR2OsTfvJjHmYsx83t6eURxad44Ci1S1E8ByuOg4tWW/Yvrmpo1DJZPMXEq1tQXYnzXwkN/lUuYP+mnYNVnyqBXG9BnGqEA6JzeuvceVRttR6SpkBf3uS/WN9YeOtaT7IdnH4/jCKJlcpj/3ehh3G9ru570HbRDzmmgX+1QGYn28TkM0vVJVPJiTSfI3JulXhw9MNFo0B+/QuXK/zx4iup2QWga31bxP0VHyWWI05p8oflhkm//vuKa4Czsk5fIUnqJbB7IVcGYES73daBo= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(5023799004)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?F+C7XvTuXl/1SoOYbp5U/4U59ndHecSRHrDCH+XPqOZk3D6Bg5FGQ+TAbS?= =?iso-8859-1?Q?xSirOLbVhBbqSAOLjpKKSEkJ/5YVwAJbahqXd3Gav/AofEbjQsKWbgnEFn?= =?iso-8859-1?Q?iuEAzWmH6XCeEq3vI1ltABv+sWC1zCU9uLqLgG3s7zw1KbNmPf6DF2vWaZ?= =?iso-8859-1?Q?26b9IVTq1fOhKFOQYuIn30YoCf0VYb6R7hajooMT19KC0FSLRCPMWxL36L?= =?iso-8859-1?Q?nD02kTsy81BtwG4R7JJ4Z1bVilkFQA/dIrc7+zNIMEl63HkBZbXMNR5aSa?= =?iso-8859-1?Q?pzVz/XmRe+oBUTUjzLiBoRXBkwynVZGBjHoLDK8Qfv2VJL6zC4hNCK6Jg9?= =?iso-8859-1?Q?pH21BS8BgAAEs3Ea7G1GNHrb1sXde3b0Exo5JxbIgnUTFOiOA7D7Fg5fm9?= =?iso-8859-1?Q?E+bnGHlJ9LPSbgp+44sbtLOrAyKXXi0ggBWsSeoJjauP/Q9oMwNnCnxhs9?= =?iso-8859-1?Q?cXmxi3BKOUylkUVNNexG1R2PT68IiaiMcs3tsHVcDhjP/mjIowzta0xEIW?= =?iso-8859-1?Q?xxnGTfs8nvfxEH3iZtXtliMXC/PjxDGnskI87rAF3oupekRfYzEugBqoMo?= =?iso-8859-1?Q?GC4h+AHCTuv3R+LMoXHgf1vM6oYbmxzaqRXFGeFcN8hPcy1qsAmeJ2d0Ii?= =?iso-8859-1?Q?9F/w4rgu/sjszuDUJKDSOYFp17wQqfyX7pFoc6UpgixHNg4+tmzCsFVA/Z?= =?iso-8859-1?Q?RkIYb/E637cuTp46khJn81xtYdppEnk6lbRX2+cT3rDxpRdyjJ5mxhwPou?= =?iso-8859-1?Q?lQK8BSmmNyq/YIeDvn+j9RMpvmADemy1mM8ULJQUhHHZhqLN8KYjLs1uqW?= =?iso-8859-1?Q?FJz1OQEgzJwYAdNN+fuvS+mKo5jCgNqX2bNkAAi45UN5azCg4Hhm2D0dNY?= =?iso-8859-1?Q?zxvAsloc4droaY08YUSt5Y5H94oGyrFFly+nru7HeIOfS3jGy1u9pk4xxS?= =?iso-8859-1?Q?tiUwTKUzboPQUM7zMMw5y5bBDy2hP85+WGTWI9Ym/rTACnidvtV49jiExp?= =?iso-8859-1?Q?6KO7rg+QregPjEsMu8OFnT7wmh4uzwhd8Cj0aeuvyqiqV+ZBcsjs3waez6?= =?iso-8859-1?Q?+Hilu23VJA0B2Cy850izZ5BDb19yAEeyyF5AZLS5ZY5tieAck9LDtNOvYk?= =?iso-8859-1?Q?tvTeBG60LRo13trGQIWfyCg/+d3rICZsdPtkI+VqFYOF3R8qZlxgtITvm6?= =?iso-8859-1?Q?41iINTSkpn3OyVP48bnKI8smI5cKXHQnR7S5o0fGcu9F8o76+wZZkUgNxE?= =?iso-8859-1?Q?BbWAaw8T3ymyEHKKFU6hVbpNZYKIYEjGa2yFnFFYqvwuznSXS6d9XvGfGi?= =?iso-8859-1?Q?sWrzix05zCtAe67Owqn4//Y+AKuU/H78YqHCzJvXJ+CphBxEc3QLFCUe4Y?= =?iso-8859-1?Q?4rQCb39P6D31ZCg5/ruRocS2plDoWRlJueJWdUtCdY4Myihsvht5fcPCE/?= =?iso-8859-1?Q?5ZKfewPvEgoMpLMV/e9ejIsEuWeu8uDeqHOgmkaUEMtkdGTeCd5fbwJslk?= =?iso-8859-1?Q?nHuYi0SP0Yg7wwnAGofzVhF+QWuQCZSNKfpMawNWr/pLB2JVhL6ktFTzzG?= =?iso-8859-1?Q?8oVGZSpzC8eWaQee28MlVKz+LaT6VNUqDE495uFMc0/W3ogLnL9shDSKAS?= =?iso-8859-1?Q?9EGaoFpzYSRFgpRJUOGcrN2kni9pQAvjAUwKLOICdYiPYm/2JhXUZVe6BP?= =?iso-8859-1?Q?7KI/FsBvevxW+Qsi8lrLcsZkeSduW795Ql8Mf9jDAZ5BPkwBTeZyr2UNHL?= =?iso-8859-1?Q?X6IpDIfASsXblITluPkww6YN6zViXSloIC/RZ8XTWLfJFyaA30q/gBzuZv?= =?iso-8859-1?Q?tKiPDAQbbw=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: 0BP4Jp16B0yBMMtYUpvCmqkDD/eX1Mt3vwtlgjeaN1JxOw4MO6/6USzDDXFCGKm0zDjSNMwBhx4Q0EwIH9qemEO8o4xq7tnQYtVbaG9OuoTIU3tf/wIGpNkTeRGH4x0m51Q+JuY2iTXsjhgyQ1cnpQAdoZbikZ3eLbd0283PpeH+0CG1C3HcQCJ62GuR4qSczepw/O6FxL40bccuUyFy/nfXc5RShhMATsjF/ba4DaE9ARyAldAB+Pr3iLGhFAGwvSiidQbE+/erYphZTbhjL3BG5T+yWteJpDcZH4nirUyOXbAyeg9eGhzpX1HLHCAHkbe98MaYwSDtww9lYAC/0g== 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: e64851c7-5b01-4b4e-123f-08df1888320b X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:14.2117 (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: NJHpnOe784Yr6CDMgRLLHYs+j3kA4vDDdWmMhcpNYRc4c08vtPKKTbWtjodRdVDSNVIo75Wzb+qac0mJHCPV0l5wrP5jFVa8Ikicr9Lvm/M= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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: 1790067855675158500 Content-Type: text/plain; charset="utf-8" The controller can send an IN endpoint's data from a descriptor ring or from a single buffer. Only the descriptor ring was modelled, so an IN endpoint in single stage mode sent nothing. Add the path: one buffer at EP_DMA_BUFF, its length in PKT_SIZE, queued by setting the write pointer. How to tell whether anything is queued also depends on the mode. A descriptor ring is empty when its two pointers are equal. A single stage buffer is queued by the write pointer alone. The buffer can hold more than the host asks for in one request, so keep an offset into it. The rest goes out when the host asks again, and the guest is told only once all of it has gone. Signed-off-by: Jamin Lin --- include/hw/usb/aspeed-udc.h | 2 + hw/usb/aspeed-udc.c | 108 ++++++++++++++++++++++++++++++++++-- 2 files changed, 106 insertions(+), 4 deletions(-) diff --git a/include/hw/usb/aspeed-udc.h b/include/hw/usb/aspeed-udc.h index 42916c0bd6..6665609501 100644 --- a/include/hw/usb/aspeed-udc.h +++ b/include/hw/usb/aspeed-udc.h @@ -53,6 +53,8 @@ typedef struct AspeedUDCEP { USBPacket *pkt; /* bytes of the current IN descriptor already served */ uint32_t desc_off; + /* bytes of the single-stage IN buffer already sent */ + uint32_t single_buf_off; } AspeedUDCEP; =20 struct AspeedUDCGadget { diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index c48e2c5f1b..dcced1b8fb 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -566,6 +566,60 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_in_desc(= AspeedUDCState *s, return done ? ASPEED_UDC_XFER_DONE : ASPEED_UDC_XFER_MORE; } =20 +/* + * IN transfer: the guest gadget driver put one buffer in EP_DMA_BUFF, its + * length in PKT_SIZE, and kicked it with the write pointer. Copy that + * buffer into the host's IN packet. + * + * The buffer can hold more than the host asked for. Copy what fits and + * remember how far we got in single_buf_off, so the rest goes out when + * the host asks again. + * + * A buffer smaller than the packet makes a short packet, and in USB a + * short packet ends the transfer. + */ +static AspeedUDCXferResult aspeed_udc_ep_xfer_in_single(AspeedUDCState *s, + int ep, USBPacket = *p) +{ + QEMUIOVector *pktiov =3D p->combined ? &p->combined->iov : &p->iov; + AspeedUDCEP *e =3D &s->ep[ep]; + uint32_t buf_len =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, PKT= _SIZE); + uint32_t left =3D buf_len > e->single_buf_off ? + buf_len - e->single_buf_off : 0; + uint32_t pkt_space =3D pktiov->size > (uint32_t)p->actual_length ? + pktiov->size - (uint32_t)p->actual_length : 0; + uint32_t addr =3D e->regs[R_EP_DMA_BUFF]; + uint32_t len =3D MIN(left, pkt_space); + + if (len && !aspeed_udc_ep_copy_to_pkt(s, ep, addr + e->single_buf_off, + len, p)) { + return ASPEED_UDC_XFER_ERROR; + } + + e->single_buf_off +=3D len; + + /* + * The packet is full, but the buffer is not finished. Complete the + * packet. Do not ACK, and leave WPTR set: the guest still owns the + * buffer, and the next IN request sends the rest. + */ + if (e->single_buf_off < buf_len) { + return ASPEED_UDC_XFER_DONE; + } + + /* All of the buffer went out. Retire it and tell the driver. */ + e->single_buf_off =3D 0; + e->regs[R_EP_DMA_STS] =3D FIELD_DP32(e->regs[R_EP_DMA_STS], EP_DMA_STS, + PKT_SIZE, buf_len); + e->regs[R_EP_DMA_STS] =3D FIELD_DP32(e->regs[R_EP_DMA_STS], EP_DMA_STS, + WPTR, 0); + e->regs[R_EP_DMA_CTRL] =3D FIELD_DP32(e->regs[R_EP_DMA_CTRL], EP_DMA_C= TRL, + PROC_STS, EP_DMA_CTRL_STS_TX_IDLE); + aspeed_udc_raise_ep_ack(s, ep); + + return ASPEED_UDC_XFER_DONE; +} + /* * OUT transfer: receive data from the host by copying its OUT packet into= the * buffer the guest gadget driver set up. @@ -667,6 +721,40 @@ static void aspeed_udc_ep_in_kick_desc(AspeedUDCState = *s, int ep, } } =20 +/* + * IN kick: the guest gadget driver wrote EP_DMA_STS to queue one buffer to + * send to the host. If a host IN request is already waiting (parked becau= se + * there was no data before), send the buffer now and finish the request. + */ +static void aspeed_udc_ep_in_kick_single(AspeedUDCState *s, int ep) +{ + AspeedUDCEP *e =3D &s->ep[ep]; + USBPacket *p =3D e->pkt; + + /* Do nothing if no host request is waiting, or no buffer was queued. = */ + if (!p || !FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, WPTR)) { + return; + } + + /* A kick serves a newly queued buffer, so start from its beginning. */ + e->single_buf_off =3D 0; + + switch (aspeed_udc_ep_xfer_in_single(s, ep, p)) { + case ASPEED_UDC_XFER_DONE: + e->pkt =3D NULL; + p->status =3D USB_RET_SUCCESS; + usb_packet_complete(USB_DEVICE(s->usbgadget), p); + break; + case ASPEED_UDC_XFER_ERROR: + e->pkt =3D NULL; + p->status =3D USB_RET_IOERROR; + usb_packet_complete(USB_DEVICE(s->usbgadget), p); + break; + case ASPEED_UDC_XFER_MORE: + break; + } +} + /* * OUT kick: the guest gadget driver wrote EP_DMA_STS to give us a buffer = for * OUT data. If an OUT packet is already waiting (parked because there was= no @@ -739,6 +827,8 @@ static void aspeed_udc_ep_write(void *opaque, hwaddr of= fset, uint64_t data, } else { if (FIELD_EX32(e->regs[R_EP_DMA_CTRL], EP_DMA_CTRL, DESC_OP_EN= )) { aspeed_udc_ep_in_kick_desc(s, e->index, old_val); + } else { + aspeed_udc_ep_in_kick_single(s, e->index); } } break; @@ -774,6 +864,7 @@ static void aspeed_udc_reset_hold(Object *obj, ResetTyp= e type) memset(s->ep[i].regs, 0, sizeof(s->ep[i].regs)); s->ep[i].pkt =3D NULL; s->ep[i].desc_off =3D 0; + s->ep[i].single_buf_off =3D 0; } =20 /* Device-reset default: root, DMA and EP-pool soft-reset bits set */ @@ -896,22 +987,31 @@ static int aspeed_udc_find_ep(AspeedUDCState *s, int = ep_nr, bool is_out) static void aspeed_udc_ep_data_in(AspeedUDCState *s, int ep, USBPacket *p) { AspeedUDCEP *e =3D &s->ep[ep]; + bool is_desc =3D FIELD_EX32(e->regs[R_EP_DMA_CTRL], EP_DMA_CTRL, DESC_= OP_EN); uint32_t rptr =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, RPTR); uint32_t wptr =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, WPTR); + AspeedUDCXferResult res; =20 - if (rptr =3D=3D wptr) { + /* + * In descriptor mode the ring is empty when the pointers meet; + * in single-stage mode one buffer is queued by setting the write poin= ter. + */ + if (is_desc ? (rptr =3D=3D wptr) : (wptr =3D=3D 0)) { /* * No IN data is queued yet. Save the packet and return ASYNC * instead of NAK. A NAK would make the host retry slowly. - * aspeed_udc_ep_in_kick_desc() serves and completes this packet l= ater, - * once the guest gadget driver queues descriptors. + * The kick from the guest gadget driver serves and completes this + * packet later, once it queues something to send. */ e->pkt =3D p; p->status =3D USB_RET_ASYNC; return; } =20 - switch (aspeed_udc_ep_xfer_in_desc(s, ep, p)) { + res =3D is_desc ? aspeed_udc_ep_xfer_in_desc(s, ep, p) + : aspeed_udc_ep_xfer_in_single(s, ep, p); + + switch (res) { case ASPEED_UDC_XFER_DONE: p->status =3D USB_RET_SUCCESS; break; --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067794; cv=pass; d=zohomail.com; s=zohoarc; b=kEHw1f3XkgjffJHD/YfcihAA/XUvVFlk2R0F0s2OrkGJ3ch2GgB0CUhEJ0I3iLLHdeOkcOXhJc66IBVvZowi1khvsLQBb+P7+3BkiKXOye2cZ9UKT7T1FDiSIy9QJfW93q8lE9I4+WpQV02TeSDNaVFi1WDJqyYSuC7X/Buim14= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067794; 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=DMjKkC8fGMB55jrAlnFw4sa58GyIrAShACGkbRmHSPM=; b=hGjlSifkWx8tzKTGGhtmegCDMjxQeFx1cjWg0C2lfcYggjvmF2PamEoqPHVQvBHNQUmvbMtMvR5ynbj+HtRMt3Tz603KanHgjHbTXMWC8iTP0OXUh3wO46ooKorg+4W+4paNqMvAHhugNYH5Jf2UrgzqJkHGxpwVCrT3EPpJqsY= 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 1790067794200487.5159117834147; Tue, 22 Sep 2026 02:03:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOW-0007g0-RF; Tue, 22 Sep 2026 05:02:32 -0400 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 1x8wOS-0007bL-Kh; Tue, 22 Sep 2026 05:02:28 -0400 Received: from mail-japanwestazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1x8wOR-0002C2-12; Tue, 22 Sep 2026 05:02:28 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02:15 +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.0428.015; Tue, 22 Sep 2026 09:02:15 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Z0SGlgF1L9wWWa0FjdEZhTS93gwtiNyZN5V8d0m2IiqcfyTcrQacHIeutsWh/oj1FWzkNxSTjht+gbTBAnzJ54bCDgddXBg1pIuKFlX2mMFCfljtE0TiSLezZG6EBxevO/vIwXV3N91kEHmoAuOjfm+zrPNS/vSiwReiy2cGhXtPTGtomBP9oXlKLh8ZJ8QUZnKQPlAH+fV5ruAF6hhgxkqMPZHOIRvm59xHNMjmXggUt7E9qUXQX6L0+nQEBDtHSQJJ1i1628A+DitSxAuJDBXGsTlUatrKt+KMLlfK/AdwFEiJ7jiIiRtt/8eRPxuYQQ7WIgp2F5ua4k4Wgam9wg== 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=DMjKkC8fGMB55jrAlnFw4sa58GyIrAShACGkbRmHSPM=; b=IzdWiAtBU2d7/LLdTa5f76R4aLnhklwwioBjvoERh0pwMou0kWD3c35rzBOHRHSldQCEUHt2+KFYCjwg4V0lE937g2MsUGk1STfjMagRskYvSIWLsJdbfo0TvtXFpLmnvwU6k3wJJJ7WMXVBXOVRcefg1K5MLFdf78ew/fZqKN9a90ia/Yyn3fXUDpl6CNgsXfdVbVy8naCudhfvUVAIcSBc1stKlNVHFwDAz2sK6l7XKt69gaQCogNK8DPOtPP24e/udy25CqtKLsFvmbzeL8g2berSkkBDWAbVYiPXpDjhStS5+sVRRO9Jfsg6g8hSH6X+EAUkDCLYrVwZi4i/9A== 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=DMjKkC8fGMB55jrAlnFw4sa58GyIrAShACGkbRmHSPM=; b=YOfurx9cpZ8TvjTS0uBbI3Q30JJ7Gml4RdH9DatpdnMx8JMY9AT/BkEKONtLn3ZvPc5ka+9AO0N/cCLIqg0+xhGygvlYvZ8Ilz+A01Dmt7jMH5otUSOP6tcaGn3/ku6EF19hzXVG8mkG21/WFK42YER4oVWelbJ7RIJhry94RS9ymkcvry7FNKY5obrjfWu871XtJDS0cNKpPGFrqV6OSKdyJQO+EEN8n1vGhL09ugKZPrkbzHQtferh1CKsw3Z4XcQhLDskX0RFvy/SsLIJ2OjpnmF5FDrwKY9nQGmKiHshYpSlFtUG7yFpFAN+D49Rm4Gc7849lYy8z7lZoXoDRw== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 16/19] hw/usb/aspeed-udc: Use the endpoint max packet size for OUT transfers Thread-Topic: [PATCH v1 16/19] hw/usb/aspeed-udc: Use the endpoint max packet size for OUT transfers Thread-Index: AQHdSnEQl2OWQ2eYMEiQGsuC3sIa3w== Date: Tue, 22 Sep 2026 09:02:15 +0000 Message-ID: <20260922090154.1792077-17-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: 813b1637-64ac-42ef-6d09-08df188832a3 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|56012099006|10067099003; x-microsoft-antispam-message-info: n+TheskpFSXdSbH3wJtyjxlDV4nSfco+zaKvnIicsKHo8q5EMcgk+wdtT9ulK/PXnKHymD4RoWiNNqT0PlMYtkvVkYIMTyKvgK4RaZLriuUOd3fbpOZ0br8FuR+rxlO2nOJsApkpCRSo2+rm69TYiXQ6w5iFMxCya6QqL14oftJW+Q1YfR19n4NqYI19euy507yESV/6wIIeA2de6vSl4i7eHyWD+lAm2xHgmCPN4c3YhsViHkroul5qeTz+6rzyv5fLeT1T2cD3cZm7GdxMZGOHoAUshXBcRzMVrejZZ0VOthWemqkjxB3umZni33mULjxBUFVTX4Vqc4xK2QjFfFoUnOumPcseNptpged0KG7cASOaPPVqyfbKXWqJVoq/bDBjrq2eq9XkmzqozBs6czCJIL6GO0qekyETd0c/2zwcFBBfey6CApSJJJevrgqFsIgvvV1kvL7H8JxZyLV9EQ7UOAOfeprOh85/X4yCSFgYFb1dvfw4ju45wkF0SJI2hHtyA/CkCND1djfzqHX8+qfYmiD0XR+NrcQYoWjc44Wq2aeG6fPodLR8AqtQ7aTZ6r8t3NBXTCKG0rvr9MobD3rXKEVaYCswqY/Gx9VJz0UZV01X4Kue+fxIHYeYC3LYKHj8fEllzLgyJna8dPsN2dBO6nRHkju+pbvWy6b1Ys8oByOKHYgX+MCNClNGY1eaVtPTMR/52eRhaLI2gUES7uvlyiRhmqGN/sltkYNT5Yo= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?U1zF6aYgTy+W6cW2AYnEFxLrdKou79pD0qNAIaCtwxaPpZ9kbZgv2HPg8b?= =?iso-8859-1?Q?wB2t1gFHcV40tuIXzj0gCUqrqKsP1peOQO+R0qyX/sdYDVBRYQel8eTpqx?= =?iso-8859-1?Q?3AcFXha/q/iPdEjg8AW/zIHr8qmLY9+J4dZ7VkSSY6e+70WDLc/Zfq1AmW?= =?iso-8859-1?Q?J5r/eHdfJc8d9QIvjKydfPZEfFSbgAOSdNN1xawe3g2UQhCuJQykZi+QaD?= =?iso-8859-1?Q?lKztaofGrwTWGWz9REBtMv/Siz16wHnErfA8HIGjJwZTf5AvPGZkixGvMi?= =?iso-8859-1?Q?sdQnXIwd+TpuH12C8mxZDi0i0PN462tei6fq0hV9n7MJuD62qMv7B8qE8j?= =?iso-8859-1?Q?+hyirLVg3Zt9nTFXOH9xp5WjTQi6RytX8Vt0V0SQlu1fS/F3AlxM4tamhO?= =?iso-8859-1?Q?41DWQmr/L/YD8r+Yg1xPMVMt/ZKioH1S2CDmvu6aTzL0Mytyv54S0Ldvnn?= =?iso-8859-1?Q?O7sGoxihFC2vHg1tsBs1vzHFzDP42rOpT6S2ik8np7WR+mxzYMoWMgfRMO?= =?iso-8859-1?Q?m4mMfeuXIn0dM9hD0JsnEN3OIWXJUAoe6pCEegh4qW7w97OO5D0SKtZVFF?= =?iso-8859-1?Q?TAxJGT+jjegd95P/dqcXHHSJQ9F7mG0XGjxoNeCevyE/tEf3gE5DdR7lwW?= =?iso-8859-1?Q?AlDaEH90h8WvShHd4QulQ4ssgi4zE7KwUfwq8HKro5x33U7DU6CDv5+7jr?= =?iso-8859-1?Q?hzftgGHLczc5L7ZCK7sc5LD1t88oOEdv6WBZWSxX33+swWy2vZM3ol0yoB?= =?iso-8859-1?Q?RmXoN7eEfsY6EYvZcDRkvXohEwyG4ZPzZ7ir5xttmtj+8fHhd5vBQxAkCl?= =?iso-8859-1?Q?dNVVw4WFVbOvPsOD3TLNw34h2o3C9VqFWHKtSAN5sylV34rJEsoQa9WeK/?= =?iso-8859-1?Q?T3kS2Mh0KiRhAvAZZKVpTaYAiUe9RHwy2BNjTtMhvB2muASytYO+ENmgM2?= =?iso-8859-1?Q?c4m0Cq9voilb4asm1nvvX7Ll4Lln9qYniUXTfBOGv0Gbnn8iaAkHAFg7er?= =?iso-8859-1?Q?tmE+U1Lw9Ok6EK77d6Yqqv3CbnK5U2NAMdPxNLFI7C4y9xgZ340sQuLwi0?= =?iso-8859-1?Q?wMcbZze1BUH35NHx+UjAaoNbg2shBB0NhSoefK60oIQxsj0fMn3A/msRXY?= =?iso-8859-1?Q?X+tbEsVL2AojAVYcOvmF9vVujsgpYH+V8qTtnWj9z4RPfakTsWM/xvPH+C?= =?iso-8859-1?Q?HH6lhoAO2J28+J9TPHZcqmr/sS0VxLF8v8lEJxohTWgQq8kQgDWd8iLZ/T?= =?iso-8859-1?Q?oRnJueB5FXxlnswewzEv8hPN2XS4U79zPKZi/Bga1wKg4CQCVn+MvAv3O6?= =?iso-8859-1?Q?RqbtAsKl6EqHCzjIgGq9xa7zlfn0ht5Bl2TcFstN9TsXgp+9RV9e+XAU1j?= =?iso-8859-1?Q?6YWqU7oZ1/W6QS8AOGTjYo9id92EmtFeYxcI3WJvZI3gCw2DIwoXsKRgk1?= =?iso-8859-1?Q?KWnEYiYVj3MCXSkVygmJR63bcZQpY007rgQRwiAxcG1QFl7mK3GNMlmwuw?= =?iso-8859-1?Q?AJWJStzUAFyx9HqcWTwNn2rdRDJ1tfV3Z1SFqsZwpkfOIu5QTSIHHdwqz/?= =?iso-8859-1?Q?oUnU/G9dxmNTw7vYIAst/R/pOj3WLowOMx+p0wyqfDIoBWZeqKjyE+VEmq?= =?iso-8859-1?Q?sFW0oDIbonsnRzYOd7D53dJiczgOKIEDTf2WC3/hCz4ZFTvg+L1FfCCJtX?= =?iso-8859-1?Q?nSdLeLFoxGtJoSoMrWyzzwDAWCyOgdC3hp5BfH4LG6XCpe/s0jVO6stWtn?= =?iso-8859-1?Q?DOtWBgtViW0s3GMx6Qi8qUI/q83cNHi9Kp1zbEIyUK+skEf+T+/uIJ95ZD?= =?iso-8859-1?Q?j33Hb3aMig=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: cadtItPIJx0v2vwrB0ueSdhwf5acPAWVc1YPRJ7Sfmv1o8TqwOJbKXlRpOt3fbzlgU5ILksXfV3pmpJXQgvWjZLNS+a0ot9LBZJNWg0nGz0Yf/7XATpmuNxX6Ua1rqnm/E/LJNfNWkJzglDJFCaFWFK+0mVlRPX983zbiw48N8ZYZy0A9xEWxjSG+NHVnpxTU+6DSwwXlvI6sfIR60/ZO1SnwnoiRngRm3yor+booU0Efq3Xai8/A1wtPRpAvOWc9qh+tf0EdyLzHdPy0BgkaMwWTWpDXmT2M4ZNYaELTQLlAnYBsIoS+76LPiVYcsBKj/QQ4+Qg7R6rgdzEQ4s6eg== 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: 813b1637-64ac-42ef-6d09-08df188832a3 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:15.3948 (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: FdMBt0FDotKgQOMtyQVLzPvYRx+YulrBcpINLnUdzAtG+2BY4ZH4VD0I1oegJZBsgpHzcoQPJKGeLR6cvI8ed4p4TgXbHFMbslA8cCxBDlk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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:c406::3; envelope-from=jamin_lin@aspeedtech.com; helo=OS8PR02CU002.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_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: 1790067797176158500 Content-Type: text/plain; charset="utf-8" In single mode EP_DMA_STS.PKT_SIZE on an OUT endpoint is where the controller reports the length it received. It is not a buffer size. The model took the copy length from it, so a zero in that field meant no data was copied at all. One maximum packet is the most that can arrive, so copy at most EP_CONFIG.MAX_PKT bytes per call instead. That field cannot hold 1024, so a value of 0 there means 1024 bytes. The IN path decoded that by hand; move it into one helper and use it from both paths. Take the packet size from the combined packet when there is one, as the IN paths do. A combined packet holds more than p->iov says, so reading p->iov.size cut the transfer short. Signed-off-by: Jamin Lin --- hw/usb/aspeed-udc.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index dcced1b8fb..09f5913aef 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -416,6 +416,13 @@ static const MemoryRegionOps aspeed_udc_setup_ops =3D { }, }; =20 +static uint32_t aspeed_udc_ep_get_max_packet(AspeedUDCEP *e) +{ + uint32_t mps =3D FIELD_EX32(e->regs[R_EP_CONFIG], EP_CONFIG, MAX_PKT); + + return mps ? mps : ASPEED_UDC_EP_MAXPKT; +} + /* * Copy len bytes from guest memory at addr into the IN packet, going thro= ugh * a bounce buffer one buf-full at a time. Returns false on DMA failure. @@ -464,10 +471,10 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_in_desc= (AspeedUDCState *s, { QEMUIOVector *pktiov =3D p->combined ? &p->combined->iov : &p->iov; AspeedUDCEP *e =3D &s->ep[ep]; - uint32_t mps =3D FIELD_EX32(e->regs[R_EP_CONFIG], EP_CONFIG, MAX_PKT); uint32_t wptr =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, WPTR); uint32_t rptr =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, RPTR); uint32_t desc_base =3D e->regs[R_EP_DMA_BUFF]; + uint32_t mps =3D aspeed_udc_ep_get_max_packet(e); uint32_t desc_addr; uint32_t remaining; uint32_t desc_ctrl; @@ -480,11 +487,6 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_in_desc(= AspeedUDCState *s, bool done =3D false; bool ack =3D false; =20 - if (mps =3D=3D 0) { - /* a MAX_PKT field of 0 means the maximum packet size */ - mps =3D ASPEED_UDC_EP_MAXPKT; - } - trace_aspeed_udc_ep_data_in(ep, rptr, wptr, pktiov->size); =20 /* walk the queued descriptors, filling the packet */ @@ -624,19 +626,21 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_in_sing= le(AspeedUDCState *s, * OUT transfer: receive data from the host by copying its OUT packet into= the * buffer the guest gadget driver set up. * - * A host packet can be bigger than one buffer, so we copy at most PKT_SIZE - * bytes per call, continuing from where the last call stopped - * (p->actual_length). The caller keeps the packet parked until it is fully - * copied. + * In single mode PKT_SIZE is where the controller reports the length it + * received, so it is not a buffer size. One maximum packet is the most th= at + * can arrive, so copy at most that much per call, continuing from where t= he + * last call stopped (p->actual_length). The caller keeps the packet parked + * until it is fully copied. */ static AspeedUDCXferResult aspeed_udc_ep_xfer_out_single(AspeedUDCState *s, int ep, USBPacket= *p) { + QEMUIOVector *pktiov =3D p->combined ? &p->combined->iov : &p->iov; AspeedUDCEP *e =3D &s->ep[ep]; - uint32_t chunk =3D FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, PKT_S= IZE); - uint32_t remaining =3D p->iov.size - (uint32_t)p->actual_length; + uint32_t remaining =3D pktiov->size > (uint32_t)p->actual_length ? + pktiov->size - (uint32_t)p->actual_length : 0; + uint32_t len =3D MIN(remaining, aspeed_udc_ep_get_max_packet(e)); uint32_t data_buf_addr =3D e->regs[R_EP_DMA_BUFF]; - uint32_t len =3D MIN(remaining, chunk); g_autofree uint8_t *buf =3D g_malloc(len); =20 if (data_buf_addr && len) { @@ -659,7 +663,7 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_out_singl= e(AspeedUDCState *s, PROC_STS, EP_DMA_CTRL_STS_RX_IDLE); aspeed_udc_raise_ep_ack(s, ep); =20 - if ((uint32_t)p->actual_length >=3D p->iov.size) { + if ((uint32_t)p->actual_length >=3D pktiov->size) { return ASPEED_UDC_XFER_DONE; } =20 --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067844; cv=pass; d=zohomail.com; s=zohoarc; b=XM4VIw0u+VBi/FCPzDZIHgbFxqyANlX9PamUmcjnNr2xerl41SMS4VtRQbn0a8A9iAs7LxZxpyvFsxhmOdv80KEeNe82xWtZH+e8aPVLohpn8e4p1j7IofmZL6JK7zoP/4Oeb/61AdX1q9rEwnFd1ssIhIg8LOn5BPITPW/xgeE= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067844; 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=yfzX/ERWx5ePggKAIGR0DI4pPJm0KTIGaNFulqiCjis=; b=Eqgzo6Smjo/ZrsTvyWTBNTG8wpqH6TJBK1AiFVMw01VWErtjKaqOz1+1LFICE6JJXglV7gbPd2JNaSzkG1ww6Ot3NceXwoLxEJdu2bmnvVzWBXlRndQvw2YXO7xWEreT6NmQcdOCMPEAipNgnAWa+R7/oYkDuO3g1RLDF9MNMSY= 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 1790067844740180.57396683100103; Tue, 22 Sep 2026 02:04:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOp-0007su-UP; Tue, 22 Sep 2026 05:02:51 -0400 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 1x8wOo-0007nd-1G; Tue, 22 Sep 2026 05:02:50 -0400 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 1x8wOm-0002CW-A4; Tue, 22 Sep 2026 05:02:49 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02: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.0428.015; Tue, 22 Sep 2026 09:02:16 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=v7u1O3IJZxBiD3ItVr3xI4ZnQ/pFAS6OiUL0rOHS+osSdMPgkW2b6tFHr/YuuDkDkUxN5e4JDgibp3smAsD3eG4V9WPGUeVPxwziu4UplKynq+X8+Uc98buX1Gn+vPS/tkXHmuCE4JhkmAr083DS0NkQ7NjZA8+hZ+Qdy42gN46K98FVfwG44Z+RyN4hw64xKXOMDIahqipx+c4fC5smcHsuIgidI4XXeGVOC24Kp3oNrm3PkyjoKWQGg3tp4SlQOm7NeUwtPsoyzes9Tx2dDyvGuHOTZxRdv3Zz7C6TCuaZ9XJ+lkJJL4tC3a7wbbkxHZFTrURgzZb+D0Ue2BlVVA== 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=yfzX/ERWx5ePggKAIGR0DI4pPJm0KTIGaNFulqiCjis=; b=rk9GugZKvJknuGW3tPj9BkKYX5QlxJR3yHXbu4Ylk3i+MePsL2JhFrn7xjfzBke4PaV4IcaAxl6oEqoTy8Npk5Z/KwnUl10ZYbTe6udZRTVyhRRn0D2U6Y7miBJN0HqtIwNWcXHVhfMLM/0UeFQfA7mGTWgKuD0L3lLSYfhZZ7s+omH4atZ0gTfmelS+e6Cmjx4V+wzwh+cc9vDOrnLYSB3889Z120bqbyBL/9Jvo64ChR8ZJUQp08weL+6aD1PPkxrOweMfjlV0b2AEa663EkRe8l4Eauj+Rb9t89BE88XtTVz1CM7KEzELOo2AF/Lc9xK6w6T8et/ixanvFOlUMA== 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=yfzX/ERWx5ePggKAIGR0DI4pPJm0KTIGaNFulqiCjis=; b=Es/vGhrR1DYPopNFpmjVbtYsOzKmvx/XNzdZS5RcyK0c03ua8unn0frYVosaRoBswwBGhykpvoAUEAP4te5cH1Ty5eb8hLKSIMAvcJIuayuQAP/S+h9NrrNwqdAEYXNU+YxZ2fD/+Zj8TaBX7SlobQ2X8Fu/0tfaznKTnLnZGRVxCrDkefCvaSfH1UPakWCDpevianwT+MuI2EWK3emVb+LV1WckmGgt0qeE9qPD34ecln3SLQ1r+iSBoKoAS1Lg2w3E9r9muOjMRJXf1iBI8FK6UabVaTafhx9Hlz3ZTyl8r42mj9Md7Pdjb0k4ddYJ0EIqkxSdU4spy0+KCFuOfw== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 17/19] hw/usb/aspeed-udc: Add trace events for the transfer paths Thread-Topic: [PATCH v1 17/19] hw/usb/aspeed-udc: Add trace events for the transfer paths Thread-Index: AQHdSnEQKRfqOyMklU2V5oCTqcrJhA== Date: Tue, 22 Sep 2026 09:02:16 +0000 Message-ID: <20260922090154.1792077-18-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: 3af748ff-4961-4636-5755-08df18883358 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|5023799004|56012099006|10067099003; x-microsoft-antispam-message-info: 8CUBWFnISZI14EQkpXp6HjpUFL7sBYSuL+FbdIO3KYLVJhV627TwJ1Wi53YFBvSz7mC1qCOqIQGmR3Rkkhmeup33ESFEy9EVDDgfCTV9nG1TaR6MsBDvtKfcO2DBplJzFvDvN6gouC0x6uSzVFt+71oC5nl498BBJ4LGnv0O22Xh3SVd4MffktGtSSeNRPhV65OvilO2SJ+6dCKN478+wMKr+DoCUwE+VgIW0cFXIvZF63DYjcVi4O2XE6jCT3HeVVTdjkSngZwMuw9fKf+m5YBBHS6uADF9AfN0GkWiztWAtZDSP4ROkTXvf22tfw5aqVZndEjcvb8ikTe7X1xC7e/NByrkqpF8uDODNyAE+lR66TYogi48bjsVQPoda7TN7kg7B2VDAqxtEPHJE/KxRMucZTzgmF7WlMGjte32XjxDzdQROA4RN96j2vehtndYbXVDF9wpA7FgmSPMWBgVpAn0n6OA+ocyinq7hRsbIQ6RAkWVtzYILD6LuVV4ZNCUCHkIMr0ZhZcfgED87iWN8oOZR9q4BrWsRcltGSvwl8mddZa786ElYJpds1qerZGyAN0zYptQw9mwDlRjXn019jItij93X+wSDxVWy/0uaznYLS7HNo5SE2XCpjLhFLaEpfu5Rl3WSwVz01mxOo9JVxhAHSPDGBlmOuEzoMa/StDddApZvzDXGzhg27Q7vBPAegg8HAVV2DujIfJwceb+HD4Drgyw6QTQNzK2xELF0ZI= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(5023799004)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?nwMrqNqjwKUWtxWid0pqEfEtoNo6j/ceQ9Yc+ivkMzVaApqkYJNS/f2zgo?= =?iso-8859-1?Q?IqEtw6SpvBz6XAGfVBvN/qQK++v+/Ee9p80WXyj8mWnbxhnkFjwQJSrbD3?= =?iso-8859-1?Q?gG59l+78NRxH82SK2cG/64DY2imGispA5J4dlaQn+v0z0+a+zPFGWrya2f?= =?iso-8859-1?Q?YzPmgiCRYv2MTYtmfDEquU05+UoL9fKtTHeISCb8ICevkBR/Wv/2efUOoP?= =?iso-8859-1?Q?e1z9BQdWvKhvd6uFYl1zKrsL/lDS/c7m9CcelNYwV/KIIavHynwDL474a8?= =?iso-8859-1?Q?SRRgLL84o8TO8y9bnqVS5rDPKHj+/p8YHdrPNbbwlqXC9tSa2FXsOdp5Yc?= =?iso-8859-1?Q?grTpFWU7i199qb3hh7iGiL5LhCmu6FR2Q3UGAg8nsfpvGVMr6i4/2YmVxJ?= =?iso-8859-1?Q?yayNdnj1BsTbWFEYe3G7RPrFeoM1wtlsRBFeXeF32YALo4JyH3FRTFRm/Q?= =?iso-8859-1?Q?ORdpG0RtkAGXQP16QAZeOlcfALw+amuD0gkK/DSB7MxFhDsL0QhHpNhuHj?= =?iso-8859-1?Q?hOHQQY+LHllpyhzArKcUjTN1ScUr1Y/qWqzY1G4oq1JOxPXBMBeFJAmFgg?= =?iso-8859-1?Q?j0BO6hdSo43jL1Bz5Sqh5lzUbj2A2EqjPLbnBNzAz3heqzgcb0DLlQbe/D?= =?iso-8859-1?Q?GAWew1BOmhwnC2YTRxkjV0Gh7f55XKxLnaXMIoBgZwUd6LbVDEzj09Q/BD?= =?iso-8859-1?Q?ux09SpCVrrUaoReH7Noa7ScbFOB9pHl1WzKjmgHPJsYIxfQ7FeiLdZpQZJ?= =?iso-8859-1?Q?nmW0JQ9nzf89OVxw0sWBokWl9nY1dRkrzvc58X792+Swd0cI/xEWQdaOjl?= =?iso-8859-1?Q?eqSa4gAGExfDdGnyBBUb8UKfqA2sAgpiLCnUfHEIsAK8mumCxw1SKaLDPe?= =?iso-8859-1?Q?wmr6KzuYB2klQDTx99ehJkQ8M0Tp6Kom16XfVSmzcVgyFJgh9R1w1eXdh3?= =?iso-8859-1?Q?Gcfp+e/vM5okFs+GaO1WgSVCxyOJT8I/I/sveMPpc0YEiOtr1aOpbhWZbI?= =?iso-8859-1?Q?D+1+LGckjeqNvY7KfdDEmUI1A+Kze9ORisLyvHEOsRAfxQTrgS+0p6v/Hj?= =?iso-8859-1?Q?WrsncvbD2ABIpri4JqXHK7Wo8NT0b6/JaE5Fc4wxF7OIGkFgsqcPPA/EdL?= =?iso-8859-1?Q?jNxtsHOcxNafDln+6bjhL5dmYgcuAZcbHXMiAmKa9yyhDN50RuxXOWMOHo?= =?iso-8859-1?Q?LPgMaC/F+a7Mr7rgD9qOHOCNICJFQtmPOl0cOE4hjm+qrVn8HDO4PG9YFL?= =?iso-8859-1?Q?qUOsTTdNLG/YodqkOR3YGdITxpTLzMuRmTOkDZYsnb7J3OJWWYXmVJPztN?= =?iso-8859-1?Q?bwRHZb5OvWTI20YM0+rKtL+NRGWSQQKJR7K2lxVjN+3VKqx4nH+oEMcqDS?= =?iso-8859-1?Q?qpUSDNvEjYAnZW1833wcXvOxbsQj7G4KW+G3QgVUa66GDRzoc98q4S+lYQ?= =?iso-8859-1?Q?gXwJc501UNxELxV1w7eVjSQLOwy86pTY/OTWCcKAmJTPwjsnmCtVOiLncV?= =?iso-8859-1?Q?xqDBz6TTYYgTSe10hp6F3EWFx75XNXzU3UPaqL6odb4CJkxbG9dDl4fwrA?= =?iso-8859-1?Q?8Oj0Ofz8nLFcxX9RcUo62t0PZWf6aMXqnl2MxFAwub/Gt6lyqYQSYfwsd1?= =?iso-8859-1?Q?vzbM8g5zvrj6STD20A7Zf6FsWhMFtxNgaFGB78kwmkbGOWExS4XPoBYnT9?= =?iso-8859-1?Q?MUS4DZLSLe/hU8JO+75UUAkdQzEJ2dTUmq55sZGWJidngcLZD778sFX1Az?= =?iso-8859-1?Q?vR1nthB450eYhn8Yx8W4GtPUSoCTLQDc5WyLLJ2G7QqolzOvnIoR9hUyYR?= =?iso-8859-1?Q?XI8w7opu8A=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: jtK0/ZRO1Zgc/oOTBqJQU8YnQXht8iAYzHpnI/PHg6yhrUhPoe6qT2tvKPL9DgpTWKBfa/Rd6BnkZQKt2NqbRZt5/yb+tT0iMsKj4n1+ehDOfLr1L551RhZBkn7z6Thb4QDOZh7dJELhmVmsPujvxyRE7envGJnQQ3HKrePC10grpf5MELWPo8tQaPVI2Qm6NxiR/ih8hy8/WcXrtjXoEfIr0LklntvF8O1Nji3fgI//7CsoeDFJ7s1kUjVaZZ5XIkOod+I+VZC/ofXplLm1d9ScXtz6m1A35o99K/OJLp5T3wcD05VdyqJWszJ72ZxQjnj/yBot+Ee+E4ujbLlxXw== 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: 3af748ff-4961-4636-5755-08df18883358 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:16.5412 (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: n2ojDb9U5c3cGbp1S6eyZvM3YsZ5EpsHCN6MTqyA07mPJAU7r1SeaUqjWW8wsv/zUjzBv+QVf+AI5uTfNeMYeVnAMcL5oyHVaQWfBVFrUXo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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: 1790067847530158500 Content-Type: text/plain; charset="utf-8" The register traces show what the guest wrote, but not which transfer path the write chose, how much each call moved, or when the host gave up on a packet. Add one event per path, so the name says which path ran and a single path can be enabled on its own: a kick, a transfer result, and a cancelled packet. Signed-off-by: Jamin Lin --- hw/usb/aspeed-udc.c | 23 +++++++++++++++++++++++ hw/usb/trace-events | 7 +++++++ 2 files changed, 30 insertions(+) diff --git a/hw/usb/aspeed-udc.c b/hw/usb/aspeed-udc.c index 09f5913aef..1c99e45d9a 100644 --- a/hw/usb/aspeed-udc.c +++ b/hw/usb/aspeed-udc.c @@ -565,6 +565,9 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_in_desc(A= speedUDCState *s, aspeed_udc_raise_ep_ack(s, ep); } =20 + trace_aspeed_udc_ep_xfer_in_desc(ep, (uint32_t)p->actual_length, + done ? "done" : "more"); + return done ? ASPEED_UDC_XFER_DONE : ASPEED_UDC_XFER_MORE; } =20 @@ -606,6 +609,9 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_in_single= (AspeedUDCState *s, * buffer, and the next IN request sends the rest. */ if (e->single_buf_off < buf_len) { + trace_aspeed_udc_ep_xfer_in_single(ep, + (uint32_t)p->actual_length, + "buffer left"); return ASPEED_UDC_XFER_DONE; } =20 @@ -619,6 +625,9 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_in_single= (AspeedUDCState *s, PROC_STS, EP_DMA_CTRL_STS_TX_IDLE); aspeed_udc_raise_ep_ack(s, ep); =20 + trace_aspeed_udc_ep_xfer_in_single(ep, (uint32_t)p->actual_length, + "done"); + return ASPEED_UDC_XFER_DONE; } =20 @@ -664,9 +673,15 @@ static AspeedUDCXferResult aspeed_udc_ep_xfer_out_sing= le(AspeedUDCState *s, aspeed_udc_raise_ep_ack(s, ep); =20 if ((uint32_t)p->actual_length >=3D pktiov->size) { + trace_aspeed_udc_ep_xfer_out_single(ep, + (uint32_t)p->actual_length, + "done"); return ASPEED_UDC_XFER_DONE; } =20 + trace_aspeed_udc_ep_xfer_out_single(ep, (uint32_t)p->actual_length, + "more"); + return ASPEED_UDC_XFER_MORE; } =20 @@ -686,6 +701,8 @@ static void aspeed_udc_ep_in_kick_desc(AspeedUDCState *= s, int ep, uint32_t cur_rptr =3D FIELD_EX32(old_val, EP_DMA_STS, RPTR); USBPacket *p =3D e->pkt; =20 + trace_aspeed_udc_ep_in_kick_desc(ep); + /* * A normal kick only sets the write pointer and leaves the read-point= er * field 0 (the read pointer is ours to advance). The guest resets the= ring @@ -735,6 +752,8 @@ static void aspeed_udc_ep_in_kick_single(AspeedUDCState= *s, int ep) AspeedUDCEP *e =3D &s->ep[ep]; USBPacket *p =3D e->pkt; =20 + trace_aspeed_udc_ep_in_kick_single(ep); + /* Do nothing if no host request is waiting, or no buffer was queued. = */ if (!p || !FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, WPTR)) { return; @@ -770,6 +789,8 @@ static void aspeed_udc_ep_out_kick_single(AspeedUDCStat= e *s, int ep) AspeedUDCEP *e =3D &s->ep[ep]; USBPacket *p =3D e->pkt; =20 + trace_aspeed_udc_ep_out_kick_single(ep); + /* nothing to do unless an OUT packet is waiting and a buffer is ready= */ if (!p || !FIELD_EX32(e->regs[R_EP_DMA_STS], EP_DMA_STS, WPTR)) { return; @@ -1155,6 +1176,8 @@ static void aspeed_udc_gadget_cancel_packet(USBDevice= *udev, USBPacket *p) AspeedUDCState *s =3D ASPEED_UDC_GADGET(udev)->udc; int i; =20 + trace_aspeed_udc_cancel_packet(p->ep->nr); + if (s->ep0_packet =3D=3D p) { s->ep0_packet =3D NULL; } diff --git a/hw/usb/trace-events b/hw/usb/trace-events index e84561d2e8..3b828da36d 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -395,6 +395,13 @@ aspeed_udc_handle_data(int ep_nr, const char *dir, uin= t32_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" +aspeed_udc_ep_in_kick_desc(int ep) "ep %d" +aspeed_udc_ep_in_kick_single(int ep) "ep %d" +aspeed_udc_ep_out_kick_single(int ep) "ep %d" +aspeed_udc_ep_xfer_in_desc(int ep, uint32_t sent, const char *res) "ep %d,= sent %u, %s" +aspeed_udc_ep_xfer_in_single(int ep, uint32_t sent, const char *res) "ep %= d, sent %u, %s" +aspeed_udc_ep_xfer_out_single(int ep, uint32_t received, const char *res) = "ep %d, received %u, %s" +aspeed_udc_cancel_packet(int ep) "ep %d" =20 # redirect-server.c usbredir_server_chardev_open(void) "chardev opened" --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067921; cv=pass; d=zohomail.com; s=zohoarc; b=QZ7Cym+wzImPeod92WI1s4/bkMTIyN6fkEG//j1hZHRehau9QSdkRcajwzH7ProhXaILu3yWMKDPvMrIE5LlF4apqdzHJ/P/UoVztpgnYterxSxHDdhXlai0gd9tQo4fkVZJjA1VhmbaNm1Gz/mV7b84VUuwZ01qr4zY3EZ+tG8= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067921; 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=2j2uqHv+0pvxw/qI5BkdPDALT0W4EgDoWe/QBtg2wRY=; b=JV5f23hhZZBBWwZkdSHnnNWHNFVzbn7DN7pFkU3BTeNd2ZQys3ChoHEulrRjj0xhUL0qYFcG1qbmC5H/gJZZI+7XAQmaQXifV8YqhLzxkzMMzMhW4a+0AiFkBY8cE2clOfMKPDotPHuT2bBPyQf7EF+5KKMwyFX2bje+e8m76Og= 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 1790067921332843.1594158054419; Tue, 22 Sep 2026 02:05:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOX-0007g5-8i; Tue, 22 Sep 2026 05:02:33 -0400 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 1x8wOV-0007e2-CD; Tue, 22 Sep 2026 05:02:31 -0400 Received: from mail-japanwestazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1x8wOT-0002C2-Qt; Tue, 22 Sep 2026 05:02:31 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02: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.0428.015; Tue, 22 Sep 2026 09:02:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dTNlZWDVyrEJ2//IkiRz72SEXJ05amV+MR0bciO3A0j8oh02jGXH5q4nJxTE5cy/dgNJJCyEdcfa6MiOeP0PuMlrELlKNkn35Y0PBB8x3pvh0Y7GvofQmGNQ9xVxB/K3jhbkbWFQAGDtv5rxkyP6FzsWepQtjjhFBZW/c0fzAu4ZROieSQrZwLHZvtbS+YoyHBvzJwqqI/w7X3JA94gZJL1nt1I/EQxn57JJvoHIT8YpyArCJfVxwomSFGfVDSjyzy1X4bETGJ7WT/z5vpFdPS8mr68oimYHJ8v02zvsMFrZcywbniFNTTNu1+Q9X357jR6JLgk7CNPiI26Hnmprqw== 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=2j2uqHv+0pvxw/qI5BkdPDALT0W4EgDoWe/QBtg2wRY=; b=rpq0X3TO+XaFCWRDVFtzvbKHjOTwDGpM/6GMqQYuico74McSh8gOxAvG5Nh33Zy6Muyw7o8Xv/jMyePtVDqTbnySFmfgK28cd/IkL05IQlnET2nr2j4phVe7kwSjkiOgOgFRhbkrdLvZfncCkolQ7sHwuVNxlKQU7rYTSnY6MTKx6cKDCC9xIq6k+t4JQfbtYiBcXJ0zaHPTCLmvQaU5vHSokKmz5/87nvPRbE+OJnEcueR2iLtaCuYBQf/X1Wu6ZdTNaqfNE/sAKOjcFXl4au12e8kwRFdWL7Pf/HbOYDFV8OgGqhcPVFjktO9qosTXHU4A5ssMKDRK/5YmfGbKCQ== 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=2j2uqHv+0pvxw/qI5BkdPDALT0W4EgDoWe/QBtg2wRY=; b=LCUQ60N8T5maUI/sOzoHI4BIlKZVIQdbEOaLoMdn/Pc70uvlpGxfdE4J6NgC3Ljaako/hazrVn16qo32zoe5wECYKqEeLy2aet9Jcl8pb+wdBb1/UNElLjLb+nD7eSxMPxZgLKQM61bEmBGkx18H2TZm0BDxmsYG5kcOq5JBdFSbbHW7VjftqjwzPybHp19nIbmWAxqbEK5/fZjexENGmrOTsuzHkFDdSjfZ6mC6nhJaqbs/MBlQR++UXd2kUPDyB5UmUPNuFKGGMtbj6xqqeYDGB9SMqX1PzsFXo3vtdT5NMKfwfM/Ej+RGaagql72JazFZNvKhnCSl70zRTYq7RA== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 18/19] hw/arm/aspeed_ast10x0: Add the USB device controller Thread-Topic: [PATCH v1 18/19] hw/arm/aspeed_ast10x0: Add the USB device controller Thread-Index: AQHdSnERA5EbF8Yt70ibCElO4KkcPw== Date: Tue, 22 Sep 2026 09:02:17 +0000 Message-ID: <20260922090154.1792077-19-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: 16e02dfa-5e32-4178-b995-08df18883427 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|56012099006|10067099003; x-microsoft-antispam-message-info: F0BrQ46AyYDSoiirIyJW8HteRfpgXs8/U9jVtnk8TvcjB1zlebq9AXYbTnDNxzn0Uwv+RZ1EMYPihmt8WTJVTmVeveXb7pbSI6pLN3Fg312zpThv2wVXR8B3echqB0r58neEiL3eizu1EoH6Q1zA8r/ANNQp9yaIZlizFGCsZK3umUb5GDnqot/KXayQf9EvJsN2niqb7n64JIYrKA68yvgWeoNrxj4pe5uy5DWCvCiMv8JVjSBFUmUvkUwcGj/UxZ3o3JtYch1L8Thx8/tXsOEo6cjrgpuRxTLIS/osmhFg3Zi1hMjQCSUhyDVwN3HvhUwLq27292qCC1Br2ZkyYfuLbOZBMvP4iib62gMUaG7m2MeszW4BpKzrtLtTD617y0DUrQCcgymUnvQwkQcvR/0dT+NxXbEOjMNWnnDn3TQeIdcvsOg2BjMvToYGvRV0Qq6Z/StM04X4Cr+50JbHwzhbk9OOCLos9uTH+LqH7wmKZq6a26JYfyTJ7L6CpmOpDhBRXh0Jk+7q6zFTjVG0i3jQzs2y1vLGleZ7aSWogwdMZjV7XIOTBx/NONN5GseJwEJAsaUB+jCYiHZs1PmQn4l9/TZfej2smOu+tFjQpP+G88eDKB1E070Gm7amE+gd81ryO8XnFSY/7WSz4Blc9mSo2iHYl6bUPM+GeJZa8i5h4/HlqkoxSSFX1aFfJqLupYIlhETqTvd+cpqdEZr6ipVmnAL41lIOjd/jZJCWPMQ= 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(56012099006)(10067099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?+5YDz9mdfP9XQ0RPZWZww88z8l2/4xzP2douFhyvAN1eURTbGppBqExl9v?= =?iso-8859-1?Q?5KhrBLqYTtu2XyTjEk0XuKBMnsYpNdHEv7W6+YGKngcAXT6rQkvqE6Mj4P?= =?iso-8859-1?Q?+BVS6q1DsweFCBfL0VH6RKOYRMAmnXf3hCz97caw8qEsiasgdNfphebShJ?= =?iso-8859-1?Q?+Q4OGtGzGaTses7y1lTB6fNgZh2TiBegTQxbCeW5Mqi7YXArMeNCFvxdV8?= =?iso-8859-1?Q?mxZ+Aw/kvwIvwTXNPdrJWo09BUZcNeWgFZ7iY0qh6hyBb7FRyoouZJN9LT?= =?iso-8859-1?Q?7ZqcG6a1nAGwNXEjGUTaUC7ETq5ypzcK+do3ZZiN6nciUQtDOBGXN9qxu0?= =?iso-8859-1?Q?5Qt+tHx05JRktxmLhffaEtgs4e8PqSu+RZUnj3TdKO2vazYXHCBDFXEU9h?= =?iso-8859-1?Q?meJG2HY35WUt2r0E2NXahcxcmRUgcWYQSX9tCE0Vpw9daGVRK81GsenB0v?= =?iso-8859-1?Q?pb1LlWMP4E+0+kSb3yeS1UZROKaMtInLohpG5eeOYSwngoKRItkQW3Cz8C?= =?iso-8859-1?Q?oMlD/+AMEdVkphfHrGGHTyhisqfbalmcCivxWN7xRSgcIpDte2CJGUrnrM?= =?iso-8859-1?Q?UrbaZ/FCK+2FAiWKrD+UyS3HTP6zjIC4Qxqcq5idf2AHwi/emZ8SOBoYOk?= =?iso-8859-1?Q?vxpcp30qSRD/BOEfiQcFIhIHcvB15UyUK5ObisxNW0FFa56aXBAeySvMNP?= =?iso-8859-1?Q?5HO2RsMNqTCdegGqcBtekRzCrsohqIa7sndNZ2NL/DrHpWUEQpQqkoYbee?= =?iso-8859-1?Q?z/T/Sd/ysgjAe+34aA8xi5KYdFSDzFyCwqnHApAcxD9eykaPitzLfsnaEc?= =?iso-8859-1?Q?eEmUM8cnCU0jTpKAiwGVNufgFOB4En1N9ekt/MRA8FoXePLPF/uLzw44JE?= =?iso-8859-1?Q?TgbVvHFo0csRArZ3PRfkA8uDgem350/ZVqj2v1oFfQ9i/GUi2Xrs0xN9km?= =?iso-8859-1?Q?gYjL05GfhuiIpNlt4yt9YrLvaeiAM6If2nFZ7GF/PJlJsVdlbCphxUyvwP?= =?iso-8859-1?Q?T2q70gsNImclgFGu45F8KJJ8W9zeQEQBSWQLgjYUwUDWjwZskLpE8RJDy3?= =?iso-8859-1?Q?xbwmiosWX1MEC2ZQg/V3jXH+6snUxFbyMJcS3jF7Nb+JAPzlSkoE0rGH50?= =?iso-8859-1?Q?rV7cQAHpvhB1PqaBCEtVGkbMtQoNTXXJU3Jvjz0rZHdnugVr/a8qRkJ6QJ?= =?iso-8859-1?Q?qjMUZ5I39W5+9Ys99jvjwCvSQOlpdNsOPIE3JACUp4zSM3r5IYWKrwsLdX?= =?iso-8859-1?Q?cbzBrpb9hWXieskRwxrVddmJ9iAQGyixfFr5fieZ6JZApUpKeHiPU8MFLq?= =?iso-8859-1?Q?nx1AMCs5dwxWqr9opDQIJ6LBMD8vdgxCcVhxdulx5i8Fc0GZjHTND0YEDf?= =?iso-8859-1?Q?6J5Trf+ASoOX6bxEENv2AQ0ZI2oXh34SgW0fUR348fGyOES7U1Hqwieg1E?= =?iso-8859-1?Q?TpSMhQjlWFwcewefs7TKvpLcZs4luIz/KnC33pks8GBNCKzLzsFu7YuG8J?= =?iso-8859-1?Q?YScuk5M/9NLtvzSf76qci60PULjwbmow5/65IuCzoU3xHvpsgS5tC75G4t?= =?iso-8859-1?Q?S02AEUuLqhtUNXcq2N0lQtezlNnZ/cd/v7pUJTa/qJh8hlLt6ZnQ704lAp?= =?iso-8859-1?Q?UhyuxOHld78eDX2+9aqSKQLhAI2kYDyAi5M2g6mAikxyO88UFTLooziyX8?= =?iso-8859-1?Q?ZXFo0AvI+By5mv46dcMkMBB04+C5PFjXujhFAhDUJobxBy5VNt4GMTBgJU?= =?iso-8859-1?Q?4ZcqQOmWa9AeSiGB43nPWiVYywxPqVRc4rSAhi1PKS+OxRCMUpZOMnAo0x?= =?iso-8859-1?Q?tKYbg1zV3Q=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: NPBQaveDaSVBuz7/sgS2l2oemgISaj6iB8ba8Mvw5iPW7dGX3XhiY9r/9WK5P8zITICpgQJ33ZIR1zPaQje9A6HZrRF3WZQVD+tsgFveGFu0N+/jDJfjJwD6mQ3/gvWp7HvgOEJfAIjIMEkqI+B+fNomoBngxFzuCdOCFsPy7f3ZWtGHEAYVUgyTmkmo1c8PBydRf56q002WT9ocn6iMp1v/umaClSwbvxh+Edwlv9uT/+yYGH41klWIYl5qOHK4HkyTqcX7L3kIsH67+JHux2TJ8T1XPA53EGexxv2IeJNfUURF4Fd/rmekw9gV1zvBPflxW1tNyNBhjGWds17u2g== 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: 16e02dfa-5e32-4178-b995-08df18883427 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:17.9263 (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: ExodV7i02Yhooan9rotjbO7skVc3ZTM1y2hUIwbGhNSpiAlj087903uXnJW+P61VrSdr5yB1BidtbzGKvAuIxWdIUHdGMyAsttAknpB7GVw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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:c406::3; envelope-from=jamin_lin@aspeedtech.com; helo=OS8PR02CU002.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_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: 1790067923860158500 Content-Type: text/plain; charset="utf-8" Add the USB UDC device at 0x7E6A2000 with IRQ 9. The AST10x0 UDC controller is compatible with the AST2600 one, so reuse TYPE_ASPEED_UDC. Signed-off-by: Jamin Lin --- include/hw/arm/aspeed_soc.h | 1 + hw/arm/aspeed_ast10x0.c | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index 38226d9b80..4459188c57 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -167,6 +167,7 @@ struct Aspeed10x0SoCState { AspeedSoCState parent; =20 ARMv7MState armv7m; + AspeedUDCState udc; }; =20 #define TYPE_ASPEED10X0_SOC "aspeed10x0-soc" diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c index aeb5a4423d..81f2d78a45 100644 --- a/hw/arm/aspeed_ast10x0.c +++ b/hw/arm/aspeed_ast10x0.c @@ -162,10 +162,11 @@ static void aspeed_soc_ast10x0_init(Object *obj, cons= t char *socname) snprintf(typename, sizeof(typename), "aspeed.hace-%s", socname); object_initialize_child(obj, "hace", &s->hace, typename); =20 + object_initialize_child(obj, "udc", &a->udc, TYPE_ASPEED_UDC); + object_initialize_child(obj, "iomem", &s->iomem, TYPE_UNIMPLEMENTED_DE= VICE); object_initialize_child(obj, "pwm", &s->pwm, TYPE_UNIMPLEMENTED_DEVICE= ); object_initialize_child(obj, "espi", &s->espi, TYPE_UNIMPLEMENTED_DEVI= CE); - object_initialize_child(obj, "udc", &s->udc, TYPE_UNIMPLEMENTED_DEVICE= ); object_initialize_child(obj, "sgpiom", &s->sgpiom, TYPE_UNIMPLEMENTED_DEVICE); object_initialize_child(obj, "jtag[0]", &s->jtag[0], @@ -394,6 +395,17 @@ static bool aspeed_soc_ast10x0_realize(Aspeed10x0SoCSt= ate *a, Error **errp) sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0, aspeed_soc_ast1030_get_irq(s, ASPEED_DEV_GPIO)); =20 + /* UDC - USB 2.0 Device Controller */ + object_property_set_link(OBJECT(&a->udc), "dram", + OBJECT(&s->sram[0]), &error_abort); + if (!sysbus_realize(SYS_BUS_DEVICE(&a->udc), errp)) { + return false; + } + aspeed_mmio_map(s->memory, SYS_BUS_DEVICE(&a->udc), 0, + sc->memmap[ASPEED_DEV_UDC]); + sysbus_connect_irq(SYS_BUS_DEVICE(&a->udc), 0, + aspeed_soc_ast1030_get_irq(s, ASPEED_DEV_UDC)); + aspeed_mmio_map_unimplemented(s->memory, SYS_BUS_DEVICE(&s->pwm), "aspeed.pwm", sc->memmap[ASPEED_DEV_PWM], 0x100); @@ -402,9 +414,6 @@ static bool aspeed_soc_ast10x0_realize(Aspeed10x0SoCSta= te *a, Error **errp) "aspeed.espi", sc->memmap[ASPEED_DEV_ESPI], 0x800); =20 - aspeed_mmio_map_unimplemented(s->memory, SYS_BUS_DEVICE(&s->udc), - "aspeed.udc", - sc->memmap[ASPEED_DEV_UDC], 0x1000); aspeed_mmio_map_unimplemented(s->memory, SYS_BUS_DEVICE(&s->sgpiom), "aspeed.sgpiom", sc->memmap[ASPEED_DEV_SGPIOM0], 0x100); --=20 2.53.0 From nobody Sat Sep 26 20:00:47 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=1790067778; cv=pass; d=zohomail.com; s=zohoarc; b=aPdzFKGNx8iKDIB3Z8bMID+8M0EseC5ZssQKwkaKQXn7pSZgb9z3TYDZh1IqIbDnsj7tIin+GzJsbLYmvxbLXaTDJZAvBPVCIlImGuuQapJ9lJzcna6idqe07iXGvKG+WIWX0QqP09Cr1extdNjPFB9NU2wWSR5QCauS4rZ2UuI= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790067778; 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=1/x/oDfZOgXCh6jMRafjWduMNrsHyu4OG8lf9qexVfA=; b=c0J9mPKU+O3GX1pxDxhqoW1skCXpWqyC/UrqZsbRXCantL9U1t+Q4GZS/MLrh/9TNjAaRwPxFmdklS+9ZXij3s1ybfSI5CFcjGuUfqIIhdzcBZcLpW/MuC34Dq/2hB0uWReg2ao4u3+X1ez30xLazrDjUxD+aHvH+0jzDpEEPW8= 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 1790067778022445.7971464589797; Tue, 22 Sep 2026 02:02:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8wOb-0007iw-Ds; Tue, 22 Sep 2026 05:02:37 -0400 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 1x8wOY-0007gn-00; Tue, 22 Sep 2026 05:02:34 -0400 Received: from mail-japanwestazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1x8wOW-0002C2-5j; Tue, 22 Sep 2026 05:02:33 -0400 Received: from SEZPR06MB7362.apcprd06.prod.outlook.com (2603:1096:101:253::10) by TY1PPFFE5B965AC.apcprd06.prod.outlook.com (2603:1096:408::933) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep 2026 09:02:19 +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.0428.015; Tue, 22 Sep 2026 09:02:19 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hq4fHjzSNQ6l/p6UuzyDNm/WkEbwLbZo7zAQxxxYYetABQouFJzgQJfVjnnA2h/wpP2Vxja53mG5uOhgJJS6ZV3BW6X+OUJHTFSsV4cmwEhdIizY+BKd/at6LNf5l1XubR5o8foq8IJWH5XFkqPlOzzhCEfXK3mC8hnXjmb9ySro2zsQ3hnHFcEOvJ84rR6WHA9qv/niw+4xHB9p+p5RHPPCil+ofnaM9hKWWm1jSJbSVOAEv5z0BzVQZ7gq3R5Q1YNB9QrVynsnVd1w/2Do73C91qVnyY4QgBJVXZBc5eTcszMks5KUT2MR41PmUiij19ICgSr2hJFfzPv6VN2ipA== 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=1/x/oDfZOgXCh6jMRafjWduMNrsHyu4OG8lf9qexVfA=; b=J1H6Y1WpvKAZHpElxl5cuFnvLYAShuATx8qNuufN0Gy7XH1qdliSWnumuRYcBFvpcUerGaStTfU2pOix4d5UClB6M4M4xNayaXOkiVbpx77PoMSPl4t3OhmCMVoTxd2shH0O/dEo94ZAyBEQhpjr+ylIgMMqg9relSt/QUk7urEVeniV6ATG24VzsAy/6pGYGbPkvOWW9RN8OwCFOHdz54xXdblj+u5dJOp/W0pp09g6F5gRFlcnTLVIHM92+TaH6X/BeqRXOFzf/sRqPa2VpUkaJZAHdsbtDi7sWGeMTi31FgC3OGRmSgnDy65j6wv8pgHaVZoW+V7IIQUMucr7Vg== 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=1/x/oDfZOgXCh6jMRafjWduMNrsHyu4OG8lf9qexVfA=; b=bmqPmRfyTAcc5tpU/gqOYJeGap6/h8r0Gp7J0AClb2boHuJe5Gjk8gb3/qMjwFXHBUC5XpFfFuutPmwa3bffUsyPQ53xMxUDoXFTAP9YoBl7sQyr3xsT1NdlwiJiLg6nKmf0bJ+Lo92qqOZwLHFIs4cP03e2ZRSAS3NbD1InQkJM69zXV7YwZvmc7LiCocTFF85zb70l4Foz+aENDiDTX8QaPj56GBLj+zr24q8eX3Dq154htERMkYSwr3HGbHItUXEoMlo7nQl+3NZvPOJhAbIM1EKCJBTZ391Rk6OsjgRbUqXHJunirO+w/WWFUAZTsmwdE+J0O089R+ir6JaCmA== From: Jamin Lin To: =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , "open list:ASPEED BMCs" , "open list:All patches CC here" CC: Jamin Lin , Troy Lee Subject: [PATCH v1 19/19] tests/functional/arm/test_aspeed_ast1030: Test the usbredir server transport Thread-Topic: [PATCH v1 19/19] tests/functional/arm/test_aspeed_ast1030: Test the usbredir server transport Thread-Index: AQHdSnESvaoOW9LDRE6jBve2Ld0n9Q== Date: Tue, 22 Sep 2026 09:02:19 +0000 Message-ID: <20260922090154.1792077-20-jamin_lin@aspeedtech.com> References: <20260922090154.1792077-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260922090154.1792077-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: 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_|TY1PPFFE5B965AC:EE_ x-ms-office365-filtering-correlation-id: babdb6e5-4e89-4d25-e244-08df1888350e x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|23010399003|366016|1800799024|22082099003|18002099003|38070700021|56012099006|10067099003|3023799007; x-microsoft-antispam-message-info: 8ny58op4CZOCaQATWZoJqZXdBm/vopmifFPgsOFRoiWfkUfr47D3Tabb1df0vJZ/ifedpQ8IJyB5AtDMfBmmUO4xtus5QFfiLMe5VrX5RGgaaHQz/YQpDtDiAN/L2Pu5pqQVsq09v2VtQCg1/ZBBCM8XAqxkd4MbgYnYZMldk/1TgExJMAGhOW31aPtLizSYILFTAhPfmvgCSNeOEKUe7AuhAQxIrK/Ne24ZiQZzCges1kS4iBHGmaJXgWe+JXIUZ/2P1e39AcCdmOo7SkETIjvsyMJG7AnQ3RAtPpeQLVKdIV9tIR7JpVY/78NfEKOqi4en/jF83HtH/1eRXvTVMRzXdZ8ZzkVwy1Pm2Lb7SabNh63PIe8HB4Rr+whAt+cwGK0XUtRtXnrYFh4X1bZbfQjdoMAjNOPU4M9UmY90Cx9x+QbgvprR8jAtaB83vg0g6XsyPXIvFgjx9Twf6QQYakUaUE5SqYwVMgGepNyiowfXox2wYpGsF2s62wc3gh4uDQeDZUQUJ151kGmPZ0FdfUOHu2Fmrw5uoaVEgwhaHEpKZ3k35SeBpxIzWWA2Jhjnw4vO6fepr7D4Cs9fpKOAyC4x3FCSyPO9WBlqEExUbyhK4cqb8rr3rl7pNw9Btg673Cps0xDa/jPrJe3WG+3CfwgfP4A2fXgmbc9GfxqE3lSSu6YX6aIRONKeiVZi1q/T 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)(366016)(1800799024)(22082099003)(18002099003)(38070700021)(56012099006)(10067099003)(3023799007); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?gEVx1UuL2BLAjC+iLGaM7hcdg1wE+MM47lD0wFddrDO32bYnCkZctvy5pq?= =?iso-8859-1?Q?J/MFVeBFGw1N5UvKCak2Gon8A8tHB3l4p3r+FvraZGTL7PydAebipaOJbH?= =?iso-8859-1?Q?RCWfByE9ziNwhHXqISm1mxEMigvu7P1qOM3gS24t3LLXv6TEsfs2P8VpE6?= =?iso-8859-1?Q?5GkQsWvRM+4J1EDwMELGyT1jkfOLjFhC7w/GT5amihioxliXb5Y2LZ/Trt?= =?iso-8859-1?Q?SkHRaJ3sgiVlXYRgSaQT/FzLFUotr7AVPxfkPbfJWXoX7b75J7sRSobbwy?= =?iso-8859-1?Q?MyzDyyiRY75Ed5VirnletXV3EZZiqcovRpwlxygBBagf+fcs98qplJUOyL?= =?iso-8859-1?Q?mm8SDZXBnLxAe1cG3nmicib0NLwA1oMouHitLxsP1X1g0/0ThW7lq1hbHJ?= =?iso-8859-1?Q?LYSHIxeXOn02ZSVQ4IsvyiAPvxNB+EztHOC46EaAv45H5leM+KEqLvjz7m?= =?iso-8859-1?Q?WlPbl86+X7nAWloPlCuTExf7NH7FOdy78ugTjvvQw3tvevesqlDyMpnZzT?= =?iso-8859-1?Q?PzJ8LRqNUoKdGnRK3JsFqbn5EJcIm7eVNCsCoUF4+3xsU2nPvSMxIC8SdF?= =?iso-8859-1?Q?DxGweyY3I3t1dU+J1Fd0VuWjRIMTkfgIyih8XjtWa3He0wEf+9CIdO10Gp?= =?iso-8859-1?Q?TL75lov6kkeZqaiXIchU2hdSD7MTTWg+Ny22+XUqDjl7R73tQVZrEWNbU+?= =?iso-8859-1?Q?+Idwkv6/y8WCoL3jeudymXNPLH6itEWhUMtp/cuVJPQIb4ODSkgxd4rwKI?= =?iso-8859-1?Q?hGBMigIggqFGWbmt7Q8eM57GGBqEMTNAZJpb1y4/E3j6weFQRSGBRI0yP6?= =?iso-8859-1?Q?i60e3wqF+CKQlNxbnVASQDctK1VmApq1H5wBAATS6U/qx8h6nme/Nr3z88?= =?iso-8859-1?Q?NyQLdp95R30mDzOTqicObi4kHY/+YL7BDLlr3HKVGmAJR6mEMPluItJaek?= =?iso-8859-1?Q?64IcqcKBIyzfUcoz+EAyg5dfCz2lFYr4USLDJUMphyRBdIOFl6Y3XIrXCS?= =?iso-8859-1?Q?QBe6pPPOwXXN13HrRb1/T1LuLgPtPachvtxY5xSnxkLoVqYdp0fdV33nxX?= =?iso-8859-1?Q?+ctZ9j8kjJtMfBcOIfbhm5DFQ6JL9WCPB3PFr79jgLm/1TMMteUd8cVdy4?= =?iso-8859-1?Q?aGxF90PK9cJuZH1lPYgUNaxaakDxr8G6jPdbs+mMm7aReoAvp62cQfKqbf?= =?iso-8859-1?Q?uzRsrGUPmgsyiBuipDGfV+pCD2q1fYlSpaoOgwmkCarPNSwSUxh3pqudd5?= =?iso-8859-1?Q?Tn/dHcrGo8uD6LJiiiNWco6v+ehbP+01U3+P1hXm/1NcmRohEkleyKfyZr?= =?iso-8859-1?Q?6C/MK66stV10FjsZ27/tKQAP03XNnmItJmRratxlpmdgCEYjJ5rovhQOjY?= =?iso-8859-1?Q?SlMCV9y46yj6S9iVoNI6b0gk3hkq79lnZ2I7fclplSLfUdTP4s42DZwm2o?= =?iso-8859-1?Q?uQa14JyYvFBHgHHbu4NrzYDpHmIu+h6D9PvjvNhJzLQ7PoBq8y61bNlBYt?= =?iso-8859-1?Q?jliRIHBGkV0UmeRlANUMK67XKXCZxvRVhxjiq/UGjDyguF7JrDEXU3EjRQ?= =?iso-8859-1?Q?ULME0Ybs4nq6vgK2SHtGAM6yGH55bvyvY4z18VVakE7oRwCP28W7scIoQh?= =?iso-8859-1?Q?1uK0uQfV6OC6FyBahaLkmAkN5aTABSw3G3immKnGTrK9tqgUhYyJi49l/j?= =?iso-8859-1?Q?uia0J8B2A9QcrAbaVii1NlOcQzrQFXrW7DophjI4WVQwXUo99XVaram9dF?= =?iso-8859-1?Q?ED0D9Q0VF0pmgjWipeyoInFDLcUZ9A3DxV57SK7Yy4YqNnGjwiuu/up53U?= =?iso-8859-1?Q?yNjm2FxIOA=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: t78XAvjAp9j3g26zjbS1PVViuFZ+/oI/ZwGYQVf0s+GBjrMcv8flNbQiX8mWzpollTIXQ0JfU84CedYqfQsmPFWCCNXXKmadzofLg1Eyg2EoyzNYUTeF44/fIEcdMsPv04Pv3o92vXd4B5rmkefqNb88qerYtNOZDq2exEdh1kDdGVkPendGUyrGkiJdolca3fEK/PqLhWRcuXyEyKdR9lpwUldI/PVFrG/Bthqe7hR0rSaqfMoms1jHEo5XeJK6VZLWLMqdPbqvKGBpyFekn05L8iYX9ilAtzTzJQirGT1ZFKmxXjnH7FRmlSMt5rAhmX6sKVylLwVNBgQQYLLZmA== 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: babdb6e5-4e89-4d25-e244-08df1888350e X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2026 09:02:19.4343 (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: xuaN3kvOyX2MGk4fuDY2A3+btbbRcdVrCmia9wcPnrAKsgUK7nlxYLMGkqAN/xcGqMu17UK7UaTa2vSEAkbe5k/VobL2bFLsV8k21zLsDzA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY1PPFFE5B965AC 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:c406::3; envelope-from=jamin_lin@aspeedtech.com; helo=OS8PR02CU002.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_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: 1790067781700158500 Content-Type: text/plain; charset="utf-8" Export the AST1030 UDC gadget with usb-redir-server and import it on an AST2600 with usb-redir, then check that the AST2600 enumerates it. That covers the announce, control and enumeration paths of the transport, and the UDC model behind it. The two machines have to come from the same QEMU binary, because a functional test gets only one. ast1030-evb and ast2600-evb are both in qemu-system-arm. Signed-off-by: Jamin Lin --- tests/functional/arm/meson.build | 1 + tests/functional/arm/test_aspeed_ast1030.py | 52 +++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/tests/functional/arm/meson.build b/tests/functional/arm/meson.= build index 61b00932db..cfbd376b0d 100644 --- a/tests/functional/arm/meson.build +++ b/tests/functional/arm/meson.build @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later =20 test_arm_timeouts =3D { + 'aspeed_ast1030' : 720, 'aspeed_palmetto' : 120, 'aspeed_romulus' : 120, 'aspeed_witherspoon' : 120, diff --git a/tests/functional/arm/test_aspeed_ast1030.py b/tests/functional= /arm/test_aspeed_ast1030.py index 83a96ec322..d1d059c83e 100755 --- a/tests/functional/arm/test_aspeed_ast1030.py +++ b/tests/functional/arm/test_aspeed_ast1030.py @@ -6,6 +6,8 @@ # # SPDX-License-Identifier: GPL-2.0-or-later =20 +import os + from aspeed import AspeedTest from qemu_test import Asset, exec_command_and_wait_for_pattern =20 @@ -68,6 +70,56 @@ def test_arm_ast1030_zephyros_1_07(self): 'kernel uptime', ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$") =20 + ASSET_SDK_V1103_AST2600 =3D Asset( + 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v11.0= 3/ast2600-default-image.tar.gz', + '47e3656a14bf7a4de28d3dfbf48bc2325443bc42d270f3bc82646f92f6dea165') + + def test_arm_ast1030_usbredir_to_ast2600(self): + self.require_device('usb-redir-server') + self.require_device('usb-redir') + self.set_machine('ast2600-evb') + self.set_machine('ast1030-evb') + + ast1030_kernel_file =3D self.archive_extract( + self.ASSET_ZEPHYR_3_08, member=3D"ast1030-evb-demo/zephyr.elf") + + ast2600_image_file =3D self.archive_extract( + self.ASSET_SDK_V1103_AST2600, + member=3D"ast2600-default-image/image-bmc") + sock =3D os.path.join(self.socket_dir().name, 'usbredir.sock') + + udc =3D self.get_vm(name=3D'udc') + udc.set_console() + udc.add_args('-kernel', ast1030_kernel_file, '-nographic', + '-chardev', + f'socket,id=3Dusbredir0,path=3D{sock},server=3Don,wai= t=3Doff', + '-device', + 'usb-redir-server,id=3Dudcredir,chardev=3Dusbredir0', + '-device', 'aspeed.udc-gadget,bus=3Dudcredir.0,' + 'udc=3D/machine/soc/udc') + udc.launch() + self.wait_for_console_pattern('Booting Zephyr OS', vm=3Dudc) + exec_command_and_wait_for_pattern(self, 'usb enable', 'uart:~$', + vm=3Dudc) + + host =3D self.get_vm(name=3D'host') + host.set_machine('ast2600-evb') + host.set_console() + host.add_args('-drive', + f'file=3D{ast2600_image_file},if=3Dmtd,format=3Draw', + '-snapshot', + '-chardev', f'socket,id=3Dusbredir0,path=3D{sock}', + '-device', 'usb-redir,chardev=3Dusbredir0,bus=3Dusb-= bus.1') + host.launch() + self.wait_for_console_pattern('Starting kernel ...', vm=3Dhost) + self.wait_for_console_pattern('login:', vm=3Dhost) + exec_command_and_wait_for_pattern(self, 'root', 'Password:', vm=3D= host) + exec_command_and_wait_for_pattern(self, '0penBmc', + 'root@ast2600-default:~#', vm=3D= host) + exec_command_and_wait_for_pattern(self, 'lsusb', + 'ZEPHYR Zephyr DFU sample', + vm=3Dhost) + def test_arm_ast1030_otp_blockdev_device(self): self.vm.set_machine("ast1030-evb") =20 --=20 2.53.0