From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156719; cv=none; d=zohomail.com; s=zohoarc; b=fEw6FXPJV5vm/DTO2tlJPZjxIIIQDl/zwg0PwcoRw3+Z9ZitIFWd5x3M1MgZbj1d5+lrq+RJ5UDj0Ta9fBCshhp7Sjkfp1Cw64fD4jlug9uj4yxsudR5/zh159bISpVwYnmrphxbUElN0/gHBUtSij1Llo0k6uhhncvwbGhrSzs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156719; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4FXMbB0XtUtcgzoysRhicUURZiYx65M+iVCWWe7pIwU=; b=SzcE7i8wYiFQROX3zZOynp6wBJVvipoRrLEC3AHKLid1lth2bj8E1Te9srGg1Ij6cCEUVDW4TPUVECg3hs/ZDQl/sPCXSFxEcsFEkIpv8/VYWQlOyW5cs2uWMx7WEjnhni4LD7qroy15eGugFpYtaQVB92jw5X0OI76ppIRzq3c= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156719308246.75165384066895; Thu, 1 May 2025 20:31:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7Y-000497-HS; Thu, 01 May 2025 23:31:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7H-00048F-SY for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:13 -0400 Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7B-0001E9-IB for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:08 -0400 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-736c062b1f5so1754613b3a.0 for ; Thu, 01 May 2025 20:31:04 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.30.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156663; x=1746761463; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4FXMbB0XtUtcgzoysRhicUURZiYx65M+iVCWWe7pIwU=; b=exink78kaD7R2Dqg0tmk4Rozug6RWTNnt6pSX/8MT5T0mjNs9tRWA8jYTN596xqcv1 BrIIu/pBGztiraiFONy+9+Ru6OrA1aWMtTfILTFsDpcurRTfmwiPHuo6de+DDU3gVkDI vJSc2vchqqmB9MDX9Mlndb1ip0bZikA0YDHf2HpQF3unmYgdJSTz7U1EjCyRQSlZmHVa bWRbQ5a9WcU5dwxmihOKsGjlGBZ8VhvRfecYDv+dm4eJwqKWvffxUpM4M4AJTciuP1YH 5GLq8Aw+SHN2M7x5K760skSZkHqiPzgXovb7aO6oHNOfYV8e8PhCi2rSh9pG4SDS5aDc Us7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156663; x=1746761463; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4FXMbB0XtUtcgzoysRhicUURZiYx65M+iVCWWe7pIwU=; b=LwBFwE0hE8JRmbNwqovqewuUkvjJ6MyJpyuHyi3aL2IYG6xsR1nHFGYP2FqqJM8Irp SYtB5xpHlzgK221RkgDfxKe0JDLfumdM77AZFBdaBC9UkE9Qd0DoA3wVZaLrnrGdDpmM JlDgqaSmPxNQqDrnpnjwJX76NsImbWjM3mpfx5WrTN/lSuvLWNwOft/g/HnzwvfDh1Q2 OQx6cNZEOTdYgjHsL1oik1CNn57IjTxgL5NUBrCpscSloNijAI696nqDZ4G9i4Fdq/hS zMwFa0AeW1AR393KmhsuTx1lWr0vODSxjA7IjfeZ1zg3EX96YIIciJoDwoxUJ/KK7PIf i88g== X-Forwarded-Encrypted: i=1; AJvYcCWP1yGhTTDg4vMTOl3MMcIjfh3QH3kofFwyrrSeq9ojATmJY1aRJVeW8t7DJ9sl9QZ1Nngt7E9nNoXo@nongnu.org X-Gm-Message-State: AOJu0Yzjkw7xCHe9OfznY8pKXA1osR8jYCLGvI39rhP3L5a4zfCCOcQM sJdfcXx0YcwttEmU8shSwr6065GIRDZq7D0DoxerICDvFjteDLC1VIxDUg== X-Gm-Gg: ASbGncsbGZPvKLIV4uumGP4Po1G56StmOg6X0KgbEVw9Vc2ibhDEzE7IhdG546m9bgu AO1WRlOcvwebLcsKMMg8DmlJ+uhoHeCC4e/oUoXK3E7pChg6u7OWDv8wXAan0OS6gTe2pmtiuM7 vpseKWKagK9O1HIHLR0Ehphlps2B3IMtaxCzi4FHI7ew1g0QKm+t/sNrQBSwKJBRXgYSOJKHzlT qjM73nVpeoZWxJsD6jpT4QcfUXsT2/DM81LUWL7YB1RA6KLTY9hq1Ne9sS6RVPmrUMii7OaMu1J dOA7dVIgqOazDC4Wc3Kel1psNrZz2SqPnlVL+i0JV9gh X-Google-Smtp-Source: AGHT+IH4GNHs5JJ+gotLGreQjyaOYrUg+Q0DjywOxKYpshTlZZP1zBFe+5d+aY5Y+SYBotGJKINKAg== X-Received: by 2002:a05:6a00:1ca6:b0:736:5f75:4a3b with SMTP id d2e1a72fcca58-74058a22346mr2011933b3a.7.1746156662554; Thu, 01 May 2025 20:31:02 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 01/22] hw/usb/xhci: Move HCD constants to a header and add register constants Date: Fri, 2 May 2025 13:30:25 +1000 Message-ID: <20250502033047.102465-2-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42c; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42c.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156721449019100 Content-Type: text/plain; charset="utf-8" Prepare to use some of these constants in xhci qtest code. Signed-off-by: Nicholas Piggin --- hw/usb/hcd-xhci.h | 214 ++++++++++++++++++++++ hw/usb/hcd-xhci.c | 450 +++++++++++++++------------------------------- 2 files changed, 360 insertions(+), 304 deletions(-) diff --git a/hw/usb/hcd-xhci.h b/hw/usb/hcd-xhci.h index 9c3974f1489..ee364efd0ab 100644 --- a/hw/usb/hcd-xhci.h +++ b/hw/usb/hcd-xhci.h @@ -115,6 +115,220 @@ typedef enum TRBCCode { CC_SPLIT_TRANSACTION_ERROR } TRBCCode; =20 +/* Register definitions */ +#define XHCI_HCCAP_REG_CAPLENGTH 0x00 +#define XHCI_HCCAP_REG_HCIVERSION 0x02 +#define XHCI_HCCAP_REG_HCSPARAMS1 0x04 +#define XHCI_HCCAP_REG_HCSPARAMS2 0x08 +#define XHCI_HCCAP_REG_HCSPARAMS3 0x0C +#define XHCI_HCCAP_REG_HCCPARAMS1 0x10 +#define XHCI_HCCPARAMS1_AC64 0x00000001 +#define XHCI_HCCPARAMS1_XECP_SHIFT 16 +#define XHCI_HCCPARAMS1_MAXPSASIZE_SHIFT 12 +#define XHCI_HCCAP_REG_DBOFF 0x14 +#define XHCI_HCCAP_REG_RTSOFF 0x18 +#define XHCI_HCCAP_REG_HCCPARAMS2 0x1C +#define XHCI_HCCAP_EXTCAP_START 0x20 /* SW-defined */ + +#define XHCI_PORT_PR_SZ 0x10 +#define XHCI_PORT_REG_PORTSC 0x00 +#define XHCI_PORTSC_CCS (1 << 0) +#define XHCI_PORTSC_PED (1 << 1) +#define XHCI_PORTSC_OCA (1 << 3) +#define XHCI_PORTSC_PR (1 << 4) +#define XHCI_PORTSC_PLS_SHIFT 5 +#define XHCI_PORTSC_PLS_MASK 0xf +#define XHCI_PORTSC_PP (1 << 9) +#define XHCI_PORTSC_SPEED_SHIFT 10 +#define XHCI_PORTSC_SPEED_MASK 0xf +#define XHCI_PORTSC_SPEED_FULL (1 << 10) +#define XHCI_PORTSC_SPEED_LOW (2 << 10) +#define XHCI_PORTSC_SPEED_HIGH (3 << 10) +#define XHCI_PORTSC_SPEED_SUPER (4 << 10) +#define XHCI_PORTSC_PIC_SHIFT 14 +#define XHCI_PORTSC_PIC_MASK 0x3 +#define XHCI_PORTSC_LWS (1 << 16) +#define XHCI_PORTSC_CSC (1 << 17) +#define XHCI_PORTSC_PEC (1 << 18) +#define XHCI_PORTSC_WRC (1 << 19) +#define XHCI_PORTSC_OCC (1 << 20) +#define XHCI_PORTSC_PRC (1 << 21) +#define XHCI_PORTSC_PLC (1 << 22) +#define XHCI_PORTSC_CEC (1 << 23) +#define XHCI_PORTSC_CAS (1 << 24) +#define XHCI_PORTSC_WCE (1 << 25) +#define XHCI_PORTSC_WDE (1 << 26) +#define XHCI_PORTSC_WOE (1 << 27) +#define XHCI_PORTSC_DR (1 << 30) +#define XHCI_PORTSC_WPR (1 << 31) +/* read/write bits */ +#define XHCI_PORTSC_RW_MASK (XHCI_PORTSC_PP | \ + XHCI_PORTSC_WCE | \ + XHCI_PORTSC_WDE | \ + XHCI_PORTSC_WOE) +/* write-1-to-clear bits*/ +#define XHCI_PORTSC_W1C_MASK (XHCI_PORTSC_CSC | \ + XHCI_PORTSC_PEC | \ + XHCI_PORTSC_WRC | \ + XHCI_PORTSC_OCC | \ + XHCI_PORTSC_PRC | \ + XHCI_PORTSC_PLC | \ + XHCI_PORTSC_CEC) +#define XHCI_PORT_REG_PORTPMSC 0x04 +#define XHCI_PORT_REG_PORTLI 0x08 +#define XHCI_PORT_REG_PORTHLPMC 0x0C + +#define XHCI_OPER_REG_USBCMD 0x00 +#define XHCI_USBCMD_RS (1 << 0) +#define XHCI_USBCMD_HCRST (1 << 1) +#define XHCI_USBCMD_INTE (1 << 2) +#define XHCI_USBCMD_HSEE (1 << 3) +#define XHCI_USBCMD_LHCRST (1 << 7) +#define XHCI_USBCMD_CSS (1 << 8) +#define XHCI_USBCMD_CRS (1 << 9) +#define XHCI_USBCMD_EWE (1 << 10) +#define XHCI_USBCMD_EU3S (1 << 11) +#define XHCI_OPER_REG_USBSTS 0x04 +#define XHCI_USBSTS_HCH (1 << 0) +#define XHCI_USBSTS_HSE (1 << 2) +#define XHCI_USBSTS_EINT (1 << 3) +#define XHCI_USBSTS_PCD (1 << 4) +#define XHCI_USBSTS_SSS (1 << 8) +#define XHCI_USBSTS_RSS (1 << 9) +#define XHCI_USBSTS_SRE (1 << 10) +#define XHCI_USBSTS_CNR (1 << 11) +#define XHCI_USBSTS_HCE (1 << 12) +/* these bits are write-1-to-clear */ +#define XHCI_USBSTS_W1C_MASK (XHCI_USBSTS_HSE | \ + XHCI_USBSTS_EINT | \ + XHCI_USBSTS_PCD | \ + XHCI_USBSTS_SRE) +#define XHCI_OPER_REG_PAGESIZE 0x08 +#define XHCI_OPER_REG_DNCTRL 0x14 +#define XHCI_OPER_REG_CRCR_LO 0x18 +#define XHCI_CRCR_RCS (1 << 0) +#define XHCI_CRCR_CS (1 << 1) +#define XHCI_CRCR_CA (1 << 2) +#define XHCI_CRCR_CRR (1 << 3) +#define XHCI_OPER_REG_CRCR_HI 0x1C +#define XHCI_OPER_REG_DCBAAP_LO 0x30 +#define XHCI_OPER_REG_DCBAAP_HI 0x34 +#define XHCI_OPER_REG_CONFIG 0x38 + +#define XHCI_DBELL_DB_SZ 0x4 + +#define XHCI_INTR_REG_MFINDEX 0x00 +#define XHCI_INTR_REG_IR0 0x20 +#define XHCI_INTR_IR_SZ 0x20 + +#define XHCI_INTR_REG_IMAN 0x00 +#define XHCI_IMAN_IP (1 << 0) +#define XHCI_IMAN_IE (1 << 1) +#define XHCI_INTR_REG_IMOD 0x04 +#define XHCI_INTR_REG_ERSTSZ 0x08 +#define XHCI_INTR_REG_ERSTBA_LO 0x10 +#define XHCI_INTR_REG_ERSTBA_HI 0x14 +#define XHCI_INTR_REG_ERDP_LO 0x18 +#define XHCI_ERDP_EHB (1 << 3) +#define XHCI_INTR_REG_ERDP_HI 0x1C + +#define TRB_SIZE 16 +typedef struct XHCITRB { + uint64_t parameter; + uint32_t status; + uint32_t control; + dma_addr_t addr; + bool ccs; +} XHCITRB; + +enum { + PLS_U0 =3D 0, + PLS_U1 =3D 1, + PLS_U2 =3D 2, + PLS_U3 =3D 3, + PLS_DISABLED =3D 4, + PLS_RX_DETECT =3D 5, + PLS_INACTIVE =3D 6, + PLS_POLLING =3D 7, + PLS_RECOVERY =3D 8, + PLS_HOT_RESET =3D 9, + PLS_COMPILANCE_MODE =3D 10, + PLS_TEST_MODE =3D 11, + PLS_RESUME =3D 15, +}; + +#define CR_LINK TR_LINK + +#define TRB_C (1 << 0) +#define TRB_TYPE_SHIFT 10 +#define TRB_TYPE_MASK 0x3f +#define TRB_TYPE(t) (((t).control >> TRB_TYPE_SHIFT) & TRB_TYPE_MA= SK) + +#define TRB_EV_ED (1 << 2) + +#define TRB_TR_ENT (1 << 1) +#define TRB_TR_ISP (1 << 2) +#define TRB_TR_NS (1 << 3) +#define TRB_TR_CH (1 << 4) +#define TRB_TR_IOC (1 << 5) +#define TRB_TR_IDT (1 << 6) +#define TRB_TR_TBC_SHIFT 7 +#define TRB_TR_TBC_MASK 0x3 +#define TRB_TR_BEI (1 << 9) +#define TRB_TR_TLBPC_SHIFT 16 +#define TRB_TR_TLBPC_MASK 0xf +#define TRB_TR_FRAMEID_SHIFT 20 +#define TRB_TR_FRAMEID_MASK 0x7ff +#define TRB_TR_SIA (1 << 31) + +#define TRB_TR_DIR (1 << 16) + +#define TRB_CR_SLOTID_SHIFT 24 +#define TRB_CR_SLOTID_MASK 0xff +#define TRB_CR_EPID_SHIFT 16 +#define TRB_CR_EPID_MASK 0x1f + +#define TRB_CR_BSR (1 << 9) +#define TRB_CR_DC (1 << 9) + +#define TRB_LK_TC (1 << 1) + +#define TRB_INTR_SHIFT 22 +#define TRB_INTR_MASK 0x3ff +#define TRB_INTR(t) (((t).status >> TRB_INTR_SHIFT) & TRB_INTR_MAS= K) + +#define EP_TYPE_MASK 0x7 +#define EP_TYPE_SHIFT 3 + +#define EP_STATE_MASK 0x7 +#define EP_DISABLED (0 << 0) +#define EP_RUNNING (1 << 0) +#define EP_HALTED (2 << 0) +#define EP_STOPPED (3 << 0) +#define EP_ERROR (4 << 0) + +#define SLOT_STATE_MASK 0x1f +#define SLOT_STATE_SHIFT 27 +#define SLOT_STATE(s) (((s) >> SLOT_STATE_SHIFT) & SLOT_STATE_MASK) +#define SLOT_ENABLED 0 +#define SLOT_DEFAULT 1 +#define SLOT_ADDRESSED 2 +#define SLOT_CONFIGURED 3 + +#define SLOT_CONTEXT_ENTRIES_MASK 0x1f +#define SLOT_CONTEXT_ENTRIES_SHIFT 27 + +typedef enum EPType { + ET_INVALID =3D 0, + ET_ISO_OUT, + ET_BULK_OUT, + ET_INTR_OUT, + ET_CONTROL, + ET_ISO_IN, + ET_BULK_IN, + ET_INTR_IN, +} EPType; + typedef struct XHCIRing { dma_addr_t dequeue; bool ccs; diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 292c378bfc9..abd2002d2c0 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -47,8 +47,8 @@ #define TRANSFER_LIMIT 256 =20 #define LEN_CAP 0x40 -#define LEN_OPER (0x400 + 0x10 * XHCI_MAXPORTS) -#define LEN_RUNTIME ((XHCI_MAXINTRS + 1) * 0x20) +#define LEN_OPER (0x400 + XHCI_PORT_PR_SZ * XHCI_MAXPORTS) +#define LEN_RUNTIME ((XHCI_MAXINTRS + 1) * XHCI_INTR_IR_SZ) #define LEN_DOORBELL ((XHCI_MAXSLOTS + 1) * 0x20) =20 #define OFF_OPER LEN_CAP @@ -65,154 +65,6 @@ # error Increase XHCI_LEN_REGS #endif =20 -/* bit definitions */ -#define USBCMD_RS (1<<0) -#define USBCMD_HCRST (1<<1) -#define USBCMD_INTE (1<<2) -#define USBCMD_HSEE (1<<3) -#define USBCMD_LHCRST (1<<7) -#define USBCMD_CSS (1<<8) -#define USBCMD_CRS (1<<9) -#define USBCMD_EWE (1<<10) -#define USBCMD_EU3S (1<<11) - -#define USBSTS_HCH (1<<0) -#define USBSTS_HSE (1<<2) -#define USBSTS_EINT (1<<3) -#define USBSTS_PCD (1<<4) -#define USBSTS_SSS (1<<8) -#define USBSTS_RSS (1<<9) -#define USBSTS_SRE (1<<10) -#define USBSTS_CNR (1<<11) -#define USBSTS_HCE (1<<12) - - -#define PORTSC_CCS (1<<0) -#define PORTSC_PED (1<<1) -#define PORTSC_OCA (1<<3) -#define PORTSC_PR (1<<4) -#define PORTSC_PLS_SHIFT 5 -#define PORTSC_PLS_MASK 0xf -#define PORTSC_PP (1<<9) -#define PORTSC_SPEED_SHIFT 10 -#define PORTSC_SPEED_MASK 0xf -#define PORTSC_SPEED_FULL (1<<10) -#define PORTSC_SPEED_LOW (2<<10) -#define PORTSC_SPEED_HIGH (3<<10) -#define PORTSC_SPEED_SUPER (4<<10) -#define PORTSC_PIC_SHIFT 14 -#define PORTSC_PIC_MASK 0x3 -#define PORTSC_LWS (1<<16) -#define PORTSC_CSC (1<<17) -#define PORTSC_PEC (1<<18) -#define PORTSC_WRC (1<<19) -#define PORTSC_OCC (1<<20) -#define PORTSC_PRC (1<<21) -#define PORTSC_PLC (1<<22) -#define PORTSC_CEC (1<<23) -#define PORTSC_CAS (1<<24) -#define PORTSC_WCE (1<<25) -#define PORTSC_WDE (1<<26) -#define PORTSC_WOE (1<<27) -#define PORTSC_DR (1<<30) -#define PORTSC_WPR (1<<31) - -#define CRCR_RCS (1<<0) -#define CRCR_CS (1<<1) -#define CRCR_CA (1<<2) -#define CRCR_CRR (1<<3) - -#define IMAN_IP (1<<0) -#define IMAN_IE (1<<1) - -#define ERDP_EHB (1<<3) - -#define TRB_SIZE 16 -typedef struct XHCITRB { - uint64_t parameter; - uint32_t status; - uint32_t control; - dma_addr_t addr; - bool ccs; -} XHCITRB; - -enum { - PLS_U0 =3D 0, - PLS_U1 =3D 1, - PLS_U2 =3D 2, - PLS_U3 =3D 3, - PLS_DISABLED =3D 4, - PLS_RX_DETECT =3D 5, - PLS_INACTIVE =3D 6, - PLS_POLLING =3D 7, - PLS_RECOVERY =3D 8, - PLS_HOT_RESET =3D 9, - PLS_COMPILANCE_MODE =3D 10, - PLS_TEST_MODE =3D 11, - PLS_RESUME =3D 15, -}; - -#define CR_LINK TR_LINK - -#define TRB_C (1<<0) -#define TRB_TYPE_SHIFT 10 -#define TRB_TYPE_MASK 0x3f -#define TRB_TYPE(t) (((t).control >> TRB_TYPE_SHIFT) & TRB_TYPE_MA= SK) - -#define TRB_EV_ED (1<<2) - -#define TRB_TR_ENT (1<<1) -#define TRB_TR_ISP (1<<2) -#define TRB_TR_NS (1<<3) -#define TRB_TR_CH (1<<4) -#define TRB_TR_IOC (1<<5) -#define TRB_TR_IDT (1<<6) -#define TRB_TR_TBC_SHIFT 7 -#define TRB_TR_TBC_MASK 0x3 -#define TRB_TR_BEI (1<<9) -#define TRB_TR_TLBPC_SHIFT 16 -#define TRB_TR_TLBPC_MASK 0xf -#define TRB_TR_FRAMEID_SHIFT 20 -#define TRB_TR_FRAMEID_MASK 0x7ff -#define TRB_TR_SIA (1<<31) - -#define TRB_TR_DIR (1<<16) - -#define TRB_CR_SLOTID_SHIFT 24 -#define TRB_CR_SLOTID_MASK 0xff -#define TRB_CR_EPID_SHIFT 16 -#define TRB_CR_EPID_MASK 0x1f - -#define TRB_CR_BSR (1<<9) -#define TRB_CR_DC (1<<9) - -#define TRB_LK_TC (1<<1) - -#define TRB_INTR_SHIFT 22 -#define TRB_INTR_MASK 0x3ff -#define TRB_INTR(t) (((t).status >> TRB_INTR_SHIFT) & TRB_INTR_MAS= K) - -#define EP_TYPE_MASK 0x7 -#define EP_TYPE_SHIFT 3 - -#define EP_STATE_MASK 0x7 -#define EP_DISABLED (0<<0) -#define EP_RUNNING (1<<0) -#define EP_HALTED (2<<0) -#define EP_STOPPED (3<<0) -#define EP_ERROR (4<<0) - -#define SLOT_STATE_MASK 0x1f -#define SLOT_STATE_SHIFT 27 -#define SLOT_STATE(s) (((s)>>SLOT_STATE_SHIFT)&SLOT_STATE_MASK) -#define SLOT_ENABLED 0 -#define SLOT_DEFAULT 1 -#define SLOT_ADDRESSED 2 -#define SLOT_CONFIGURED 3 - -#define SLOT_CONTEXT_ENTRIES_MASK 0x1f -#define SLOT_CONTEXT_ENTRIES_SHIFT 27 - #define get_field(data, field) \ (((data) >> field##_SHIFT) & field##_MASK) =20 @@ -223,17 +75,6 @@ enum { *data =3D val_; \ } while (0) =20 -typedef enum EPType { - ET_INVALID =3D 0, - ET_ISO_OUT, - ET_BULK_OUT, - ET_INTR_OUT, - ET_CONTROL, - ET_ISO_IN, - ET_BULK_IN, - ET_INTR_IN, -} EPType; - typedef struct XHCITransfer { XHCIEPContext *epctx; USBPacket packet; @@ -440,7 +281,7 @@ static uint64_t xhci_mfindex_get(XHCIState *xhci) =20 static void xhci_mfwrap_update(XHCIState *xhci) { - const uint32_t bits =3D USBCMD_RS | USBCMD_EWE; + const uint32_t bits =3D XHCI_USBCMD_RS | XHCI_USBCMD_EWE; uint32_t mfindex, left; int64_t now; =20 @@ -465,7 +306,7 @@ static void xhci_mfwrap_timer(void *opaque) =20 static void xhci_die(XHCIState *xhci) { - xhci->usbsts |=3D USBSTS_HCE; + xhci->usbsts |=3D XHCI_USBSTS_HCE; DPRINTF("xhci: asserted controller error\n"); } =20 @@ -557,51 +398,51 @@ static void xhci_intr_update(XHCIState *xhci, int v) int level =3D 0; =20 if (v =3D=3D 0) { - if (xhci->intr[0].iman & IMAN_IP && - xhci->intr[0].iman & IMAN_IE && - xhci->usbcmd & USBCMD_INTE) { + if (xhci->intr[0].iman & XHCI_IMAN_IP && + xhci->intr[0].iman & XHCI_IMAN_IE && + xhci->usbcmd & XHCI_USBCMD_INTE) { level =3D 1; } if (xhci->intr_raise) { if (xhci->intr_raise(xhci, 0, level)) { - xhci->intr[0].iman &=3D ~IMAN_IP; + xhci->intr[0].iman &=3D ~XHCI_IMAN_IP; } } } if (xhci->intr_update) { xhci->intr_update(xhci, v, - xhci->intr[v].iman & IMAN_IE); + xhci->intr[v].iman & XHCI_IMAN_IE); } } =20 static void xhci_intr_raise(XHCIState *xhci, int v) { - bool pending =3D (xhci->intr[v].erdp_low & ERDP_EHB); + bool pending =3D (xhci->intr[v].erdp_low & XHCI_ERDP_EHB); =20 - xhci->intr[v].erdp_low |=3D ERDP_EHB; - xhci->intr[v].iman |=3D IMAN_IP; - xhci->usbsts |=3D USBSTS_EINT; + xhci->intr[v].erdp_low |=3D XHCI_ERDP_EHB; + xhci->intr[v].iman |=3D XHCI_IMAN_IP; + xhci->usbsts |=3D XHCI_USBSTS_EINT; =20 if (pending) { return; } - if (!(xhci->intr[v].iman & IMAN_IE)) { + if (!(xhci->intr[v].iman & XHCI_IMAN_IE)) { return; } =20 - if (!(xhci->usbcmd & USBCMD_INTE)) { + if (!(xhci->usbcmd & XHCI_USBCMD_INTE)) { return; } if (xhci->intr_raise) { if (xhci->intr_raise(xhci, v, true)) { - xhci->intr[v].iman &=3D ~IMAN_IP; + xhci->intr[v].iman &=3D ~XHCI_IMAN_IP; } } } =20 static inline int xhci_running(XHCIState *xhci) { - return !(xhci->usbsts & USBSTS_HCH); + return !(xhci->usbsts & XHCI_USBSTS_HCH); } =20 static void xhci_write_event(XHCIState *xhci, XHCIEvent *event, int v) @@ -846,15 +687,15 @@ static void xhci_er_reset(XHCIState *xhci, int v) static void xhci_run(XHCIState *xhci) { trace_usb_xhci_run(); - xhci->usbsts &=3D ~USBSTS_HCH; + xhci->usbsts &=3D ~XHCI_USBSTS_HCH; xhci->mfindex_start =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); } =20 static void xhci_stop(XHCIState *xhci) { trace_usb_xhci_stop(); - xhci->usbsts |=3D USBSTS_HCH; - xhci->crcr_low &=3D ~CRCR_CRR; + xhci->usbsts |=3D XHCI_USBSTS_HCH; + xhci->crcr_low &=3D ~XHCI_CRCR_CRR; } =20 static XHCIStreamContext *xhci_alloc_stream_contexts(unsigned count, @@ -2481,7 +2322,7 @@ static void xhci_process_commands(XHCIState *xhci) return; } =20 - xhci->crcr_low |=3D CRCR_CRR; + xhci->crcr_low |=3D XHCI_CRCR_CRR; =20 while ((type =3D xhci_ring_fetch(xhci, &xhci->cmd_ring, &trb, &addr)))= { event.ptr =3D addr; @@ -2633,32 +2474,32 @@ static void xhci_port_update(XHCIPort *port, int is= _detach) uint32_t pls =3D PLS_RX_DETECT; =20 assert(port); - port->portsc =3D PORTSC_PP; + port->portsc =3D XHCI_PORTSC_PP; if (!is_detach && xhci_port_have_device(port)) { - port->portsc |=3D PORTSC_CCS; + port->portsc |=3D XHCI_PORTSC_CCS; switch (port->uport->dev->speed) { case USB_SPEED_LOW: - port->portsc |=3D PORTSC_SPEED_LOW; + port->portsc |=3D XHCI_PORTSC_SPEED_LOW; pls =3D PLS_POLLING; break; case USB_SPEED_FULL: - port->portsc |=3D PORTSC_SPEED_FULL; + port->portsc |=3D XHCI_PORTSC_SPEED_FULL; pls =3D PLS_POLLING; break; case USB_SPEED_HIGH: - port->portsc |=3D PORTSC_SPEED_HIGH; + port->portsc |=3D XHCI_PORTSC_SPEED_HIGH; pls =3D PLS_POLLING; break; case USB_SPEED_SUPER: - port->portsc |=3D PORTSC_SPEED_SUPER; - port->portsc |=3D PORTSC_PED; + port->portsc |=3D XHCI_PORTSC_SPEED_SUPER; + port->portsc |=3D XHCI_PORTSC_PED; pls =3D PLS_U0; break; } } - set_field(&port->portsc, pls, PORTSC_PLS); + set_field(&port->portsc, pls, XHCI_PORTSC_PLS); trace_usb_xhci_port_link(port->portnr, pls); - xhci_port_notify(port, PORTSC_CSC); + xhci_port_notify(port, XHCI_PORTSC_CSC); } =20 static void xhci_port_reset(XHCIPort *port, bool warm_reset) @@ -2674,20 +2515,20 @@ static void xhci_port_reset(XHCIPort *port, bool wa= rm_reset) switch (port->uport->dev->speed) { case USB_SPEED_SUPER: if (warm_reset) { - port->portsc |=3D PORTSC_WRC; + port->portsc |=3D XHCI_PORTSC_WRC; } /* fall through */ case USB_SPEED_LOW: case USB_SPEED_FULL: case USB_SPEED_HIGH: - set_field(&port->portsc, PLS_U0, PORTSC_PLS); + set_field(&port->portsc, PLS_U0, XHCI_PORTSC_PLS); trace_usb_xhci_port_link(port->portnr, PLS_U0); - port->portsc |=3D PORTSC_PED; + port->portsc |=3D XHCI_PORTSC_PED; break; } =20 - port->portsc &=3D ~PORTSC_PR; - xhci_port_notify(port, PORTSC_PRC); + port->portsc &=3D ~XHCI_PORTSC_PR; + xhci_port_notify(port, XHCI_PORTSC_PRC); } =20 static void xhci_reset(DeviceState *dev) @@ -2696,12 +2537,12 @@ static void xhci_reset(DeviceState *dev) int i; =20 trace_usb_xhci_reset(); - if (!(xhci->usbsts & USBSTS_HCH)) { + if (!(xhci->usbsts & XHCI_USBSTS_HCH)) { DPRINTF("xhci: reset while running!\n"); } =20 xhci->usbcmd =3D 0; - xhci->usbsts =3D USBSTS_HCH; + xhci->usbsts =3D XHCI_USBSTS_HCH; xhci->dnctrl =3D 0; xhci->crcr_low =3D 0; xhci->crcr_high =3D 0; @@ -2742,56 +2583,56 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg= , unsigned size) uint32_t ret; =20 switch (reg) { - case 0x00: /* HCIVERSION, CAPLENGTH */ + case XHCI_HCCAP_REG_CAPLENGTH: /* Covers HCIVERSION and CAPLENGTH */ ret =3D 0x01000000 | LEN_CAP; break; - case 0x04: /* HCSPARAMS 1 */ + case XHCI_HCCAP_REG_HCSPARAMS1: ret =3D ((xhci->numports_2+xhci->numports_3)<<24) | (xhci->numintrs<<8) | xhci->numslots; break; - case 0x08: /* HCSPARAMS 2 */ + case XHCI_HCCAP_REG_HCSPARAMS2: ret =3D 0x0000000f; break; - case 0x0c: /* HCSPARAMS 3 */ + case XHCI_HCCAP_REG_HCSPARAMS3: ret =3D 0x00000000; break; - case 0x10: /* HCCPARAMS */ - if (sizeof(dma_addr_t) =3D=3D 4) { - ret =3D 0x00080000 | (xhci->max_pstreams_mask << 12); - } else { - ret =3D 0x00080001 | (xhci->max_pstreams_mask << 12); + case XHCI_HCCAP_REG_HCCPARAMS1: + ret =3D (XHCI_HCCAP_EXTCAP_START / 4) << XHCI_HCCPARAMS1_XECP_SHIF= T; + ret |=3D xhci->max_pstreams_mask << XHCI_HCCPARAMS1_MAXPSASIZE_SHI= FT; + if (sizeof(dma_addr_t) =3D=3D 8) { + ret |=3D XHCI_HCCPARAMS1_AC64; } break; - case 0x14: /* DBOFF */ + case XHCI_HCCAP_REG_DBOFF: ret =3D OFF_DOORBELL; break; - case 0x18: /* RTSOFF */ + case XHCI_HCCAP_REG_RTSOFF: ret =3D OFF_RUNTIME; break; =20 /* extended capabilities */ - case 0x20: /* Supported Protocol:00 */ + case XHCI_HCCAP_EXTCAP_START + 0x00: /* Supported Protocol:00 */ ret =3D 0x02000402; /* USB 2.0 */ break; - case 0x24: /* Supported Protocol:04 */ + case XHCI_HCCAP_EXTCAP_START + 0x04: /* Supported Protocol:04 */ ret =3D 0x20425355; /* "USB " */ break; - case 0x28: /* Supported Protocol:08 */ + case XHCI_HCCAP_EXTCAP_START + 0x08: /* Supported Protocol:08 */ ret =3D (xhci->numports_2 << 8) | (xhci->numports_3 + 1); break; - case 0x2c: /* Supported Protocol:0c */ + case XHCI_HCCAP_EXTCAP_START + 0x0c: /* Supported Protocol:0c */ ret =3D 0x00000000; /* reserved */ break; - case 0x30: /* Supported Protocol:00 */ + case XHCI_HCCAP_EXTCAP_START + 0x10: /* Supported Protocol:00 */ ret =3D 0x03000002; /* USB 3.0 */ break; - case 0x34: /* Supported Protocol:04 */ + case XHCI_HCCAP_EXTCAP_START + 0x14: /* Supported Protocol:04 */ ret =3D 0x20425355; /* "USB " */ break; - case 0x38: /* Supported Protocol:08 */ + case XHCI_HCCAP_EXTCAP_START + 0x18: /* Supported Protocol:08 */ ret =3D (xhci->numports_3 << 8) | 1; break; - case 0x3c: /* Supported Protocol:0c */ + case XHCI_HCCAP_EXTCAP_START + 0x1c: /* Supported Protocol:0c */ ret =3D 0x00000000; /* reserved */ break; default: @@ -2809,14 +2650,18 @@ static uint64_t xhci_port_read(void *ptr, hwaddr re= g, unsigned size) uint32_t ret; =20 switch (reg) { - case 0x00: /* PORTSC */ + case XHCI_PORT_REG_PORTSC: ret =3D port->portsc; break; - case 0x04: /* PORTPMSC */ - case 0x08: /* PORTLI */ + case XHCI_PORT_REG_PORTLI: ret =3D 0; break; - case 0x0c: /* PORTHLPMC */ + case XHCI_PORT_REG_PORTPMSC: + ret =3D 0; + qemu_log_mask(LOG_UNIMP, "%s: read from port register PORTHPMSC", + __func__); + break; + case XHCI_PORT_REG_PORTHLPMC: ret =3D 0; qemu_log_mask(LOG_UNIMP, "%s: read from port register PORTHLPMC", __func__); @@ -2841,37 +2686,35 @@ static void xhci_port_write(void *ptr, hwaddr reg, trace_usb_xhci_port_write(port->portnr, reg, val); =20 switch (reg) { - case 0x00: /* PORTSC */ + case XHCI_PORT_REG_PORTSC: /* write-1-to-start bits */ - if (val & PORTSC_WPR) { + if (val & XHCI_PORTSC_WPR) { xhci_port_reset(port, true); break; } - if (val & PORTSC_PR) { + if (val & XHCI_PORTSC_PR) { xhci_port_reset(port, false); break; } =20 portsc =3D port->portsc; notify =3D 0; - /* write-1-to-clear bits*/ - portsc &=3D ~(val & (PORTSC_CSC|PORTSC_PEC|PORTSC_WRC|PORTSC_OCC| - PORTSC_PRC|PORTSC_PLC|PORTSC_CEC)); - if (val & PORTSC_LWS) { + portsc &=3D ~(val & XHCI_PORTSC_W1C_MASK); + if (val & XHCI_PORTSC_LWS) { /* overwrite PLS only when LWS=3D1 */ - uint32_t old_pls =3D get_field(port->portsc, PORTSC_PLS); - uint32_t new_pls =3D get_field(val, PORTSC_PLS); + uint32_t old_pls =3D get_field(port->portsc, XHCI_PORTSC_PLS); + uint32_t new_pls =3D get_field(val, XHCI_PORTSC_PLS); switch (new_pls) { case PLS_U0: if (old_pls !=3D PLS_U0) { - set_field(&portsc, new_pls, PORTSC_PLS); + set_field(&portsc, new_pls, XHCI_PORTSC_PLS); trace_usb_xhci_port_link(port->portnr, new_pls); - notify =3D PORTSC_PLC; + notify =3D XHCI_PORTSC_PLC; } break; case PLS_U3: if (old_pls < PLS_U3) { - set_field(&portsc, new_pls, PORTSC_PLS); + set_field(&portsc, new_pls, XHCI_PORTSC_PLS); trace_usb_xhci_port_link(port->portnr, new_pls); } break; @@ -2884,22 +2727,21 @@ static void xhci_port_write(void *ptr, hwaddr reg, break; } } - /* read/write bits */ - portsc &=3D ~(PORTSC_PP|PORTSC_WCE|PORTSC_WDE|PORTSC_WOE); - portsc |=3D (val & (PORTSC_PP|PORTSC_WCE|PORTSC_WDE|PORTSC_WOE)); + portsc &=3D ~XHCI_PORTSC_RW_MASK; + portsc |=3D val & XHCI_PORTSC_RW_MASK; port->portsc =3D portsc; if (notify) { xhci_port_notify(port, notify); } break; - case 0x04: /* PORTPMSC */ - case 0x0c: /* PORTHLPMC */ + case XHCI_PORT_REG_PORTPMSC: + case XHCI_PORT_REG_PORTHLPMC: qemu_log_mask(LOG_UNIMP, "%s: write 0x%" PRIx64 " (%u bytes) to port register at offset 0x%" HWADDR_= PRIx, __func__, val, size, reg); break; - case 0x08: /* PORTLI */ + case XHCI_PORT_REG_PORTLI: qemu_log_mask(LOG_GUEST_ERROR, "%s: Write to read-only PORTLI regi= ster", __func__); break; @@ -2918,31 +2760,31 @@ static uint64_t xhci_oper_read(void *ptr, hwaddr re= g, unsigned size) uint32_t ret; =20 switch (reg) { - case 0x00: /* USBCMD */ + case XHCI_OPER_REG_USBCMD: ret =3D xhci->usbcmd; break; - case 0x04: /* USBSTS */ + case XHCI_OPER_REG_USBSTS: ret =3D xhci->usbsts; break; - case 0x08: /* PAGESIZE */ + case XHCI_OPER_REG_PAGESIZE: ret =3D 1; /* 4KiB */ break; - case 0x14: /* DNCTRL */ + case XHCI_OPER_REG_DNCTRL: ret =3D xhci->dnctrl; break; - case 0x18: /* CRCR low */ + case XHCI_OPER_REG_CRCR_LO: ret =3D xhci->crcr_low & ~0xe; break; - case 0x1c: /* CRCR high */ + case XHCI_OPER_REG_CRCR_HI: ret =3D xhci->crcr_high; break; - case 0x30: /* DCBAAP low */ + case XHCI_OPER_REG_DCBAAP_LO: ret =3D xhci->dcbaap_low; break; - case 0x34: /* DCBAAP high */ + case XHCI_OPER_REG_DCBAAP_HI: ret =3D xhci->dcbaap_high; break; - case 0x38: /* CONFIG */ + case XHCI_OPER_REG_CONFIG: ret =3D xhci->config; break; default: @@ -2962,60 +2804,60 @@ static void xhci_oper_write(void *ptr, hwaddr reg, trace_usb_xhci_oper_write(reg, val); =20 switch (reg) { - case 0x00: /* USBCMD */ - if ((val & USBCMD_RS) && !(xhci->usbcmd & USBCMD_RS)) { + case XHCI_OPER_REG_USBCMD: + if ((val & XHCI_USBCMD_RS) && !(xhci->usbcmd & XHCI_USBCMD_RS)) { xhci_run(xhci); - } else if (!(val & USBCMD_RS) && (xhci->usbcmd & USBCMD_RS)) { + } else if (!(val & XHCI_USBCMD_RS) && (xhci->usbcmd & XHCI_USBCMD_= RS)) { xhci_stop(xhci); } - if (val & USBCMD_CSS) { + if (val & XHCI_USBCMD_CSS) { /* save state */ - xhci->usbsts &=3D ~USBSTS_SRE; + xhci->usbsts &=3D ~XHCI_USBSTS_SRE; } - if (val & USBCMD_CRS) { + if (val & XHCI_USBCMD_CRS) { /* restore state */ - xhci->usbsts |=3D USBSTS_SRE; + xhci->usbsts |=3D XHCI_USBSTS_SRE; } xhci->usbcmd =3D val & 0xc0f; xhci_mfwrap_update(xhci); - if (val & USBCMD_HCRST) { + if (val & XHCI_USBCMD_HCRST) { xhci_reset(DEVICE(xhci)); } xhci_intr_update(xhci, 0); break; =20 - case 0x04: /* USBSTS */ - /* these bits are write-1-to-clear */ - xhci->usbsts &=3D ~(val & (USBSTS_HSE|USBSTS_EINT|USBSTS_PCD|USBST= S_SRE)); + case XHCI_OPER_REG_USBSTS: + xhci->usbsts &=3D ~(val & XHCI_USBSTS_W1C_MASK); xhci_intr_update(xhci, 0); break; =20 - case 0x14: /* DNCTRL */ + case XHCI_OPER_REG_DNCTRL: xhci->dnctrl =3D val & 0xffff; break; - case 0x18: /* CRCR low */ - xhci->crcr_low =3D (val & 0xffffffcf) | (xhci->crcr_low & CRCR_CRR= ); + case XHCI_OPER_REG_CRCR_LO: + xhci->crcr_low =3D (val & 0xffffffcf) | (xhci->crcr_low & XHCI_CRC= R_CRR); break; - case 0x1c: /* CRCR high */ + case XHCI_OPER_REG_CRCR_HI: xhci->crcr_high =3D val; - if (xhci->crcr_low & (CRCR_CA|CRCR_CS) && (xhci->crcr_low & CRCR_C= RR)) { + if (xhci->crcr_low & (XHCI_CRCR_CA | XHCI_CRCR_CS) && + (xhci->crcr_low & XHCI_CRCR_CRR)) { XHCIEvent event =3D {ER_COMMAND_COMPLETE, CC_COMMAND_RING_STOP= PED}; - xhci->crcr_low &=3D ~CRCR_CRR; + xhci->crcr_low &=3D ~XHCI_CRCR_CRR; xhci_event(xhci, &event, 0); DPRINTF("xhci: command ring stopped (CRCR=3D%08x)\n", xhci->cr= cr_low); } else { dma_addr_t base =3D xhci_addr64(xhci->crcr_low & ~0x3f, val); xhci_ring_init(xhci, &xhci->cmd_ring, base); } - xhci->crcr_low &=3D ~(CRCR_CA | CRCR_CS); + xhci->crcr_low &=3D ~(XHCI_CRCR_CA | XHCI_CRCR_CS); break; - case 0x30: /* DCBAAP low */ + case XHCI_OPER_REG_DCBAAP_LO: xhci->dcbaap_low =3D val & 0xffffffc0; break; - case 0x34: /* DCBAAP high */ + case XHCI_OPER_REG_DCBAAP_HI: xhci->dcbaap_high =3D val; break; - case 0x38: /* CONFIG */ + case XHCI_OPER_REG_CONFIG: xhci->config =3D val & 0xff; break; default: @@ -3029,9 +2871,9 @@ static uint64_t xhci_runtime_read(void *ptr, hwaddr r= eg, XHCIState *xhci =3D ptr; uint32_t ret =3D 0; =20 - if (reg < 0x20) { + if (reg < XHCI_INTR_REG_IR0) { switch (reg) { - case 0x00: /* MFINDEX */ + case XHCI_INTR_REG_MFINDEX: ret =3D xhci_mfindex_get(xhci) & 0x3fff; break; default: @@ -3039,28 +2881,28 @@ static uint64_t xhci_runtime_read(void *ptr, hwaddr= reg, break; } } else { - int v =3D (reg - 0x20) / 0x20; + int v =3D (reg - XHCI_INTR_REG_IR0) / XHCI_INTR_IR_SZ; XHCIInterrupter *intr =3D &xhci->intr[v]; - switch (reg & 0x1f) { - case 0x00: /* IMAN */ + switch (reg & (XHCI_INTR_IR_SZ - 1)) { + case XHCI_INTR_REG_IMAN: ret =3D intr->iman; break; - case 0x04: /* IMOD */ + case XHCI_INTR_REG_IMOD: ret =3D intr->imod; break; - case 0x08: /* ERSTSZ */ + case XHCI_INTR_REG_ERSTSZ: ret =3D intr->erstsz; break; - case 0x10: /* ERSTBA low */ + case XHCI_INTR_REG_ERSTBA_LO: ret =3D intr->erstba_low; break; - case 0x14: /* ERSTBA high */ + case XHCI_INTR_REG_ERSTBA_HI: ret =3D intr->erstba_high; break; - case 0x18: /* ERDP low */ + case XHCI_INTR_REG_ERDP_LO: ret =3D intr->erdp_low; break; - case 0x1c: /* ERDP high */ + case XHCI_INTR_REG_ERDP_HI: ret =3D intr->erdp_high; break; } @@ -3079,29 +2921,29 @@ static void xhci_runtime_write(void *ptr, hwaddr re= g, =20 trace_usb_xhci_runtime_write(reg, val); =20 - if (reg < 0x20) { + if (reg < XHCI_INTR_REG_IR0) { trace_usb_xhci_unimplemented("runtime write", reg); return; } - v =3D (reg - 0x20) / 0x20; + v =3D (reg - XHCI_INTR_REG_IR0) / XHCI_INTR_IR_SZ; intr =3D &xhci->intr[v]; =20 - switch (reg & 0x1f) { - case 0x00: /* IMAN */ - if (val & IMAN_IP) { - intr->iman &=3D ~IMAN_IP; + switch (reg & (XHCI_INTR_IR_SZ - 1)) { + case XHCI_INTR_REG_IMAN: + if (val & XHCI_IMAN_IP) { + intr->iman &=3D ~XHCI_IMAN_IP; } - intr->iman &=3D ~IMAN_IE; - intr->iman |=3D val & IMAN_IE; + intr->iman &=3D ~XHCI_IMAN_IE; + intr->iman |=3D val & XHCI_IMAN_IE; xhci_intr_update(xhci, v); break; - case 0x04: /* IMOD */ + case XHCI_INTR_REG_IMOD: intr->imod =3D val; break; - case 0x08: /* ERSTSZ */ + case XHCI_INTR_REG_ERSTSZ: intr->erstsz =3D val & 0xffff; break; - case 0x10: /* ERSTBA low */ + case XHCI_INTR_REG_ERSTBA_LO: if (xhci->nec_quirks) { /* NEC driver bug: it doesn't align this to 64 bytes */ intr->erstba_low =3D val & 0xfffffff0; @@ -3109,16 +2951,17 @@ static void xhci_runtime_write(void *ptr, hwaddr re= g, intr->erstba_low =3D val & 0xffffffc0; } break; - case 0x14: /* ERSTBA high */ + case XHCI_INTR_REG_ERSTBA_HI: intr->erstba_high =3D val; xhci_er_reset(xhci, v); break; - case 0x18: /* ERDP low */ - if (val & ERDP_EHB) { - intr->erdp_low &=3D ~ERDP_EHB; + case XHCI_INTR_REG_ERDP_LO: + if (val & XHCI_ERDP_EHB) { + intr->erdp_low &=3D ~XHCI_ERDP_EHB; } - intr->erdp_low =3D (val & ~ERDP_EHB) | (intr->erdp_low & ERDP_EHB); - if (val & ERDP_EHB) { + intr->erdp_low =3D (val & ~XHCI_ERDP_EHB) | + (intr->erdp_low & XHCI_ERDP_EHB); + if (val & XHCI_ERDP_EHB) { dma_addr_t erdp =3D xhci_addr64(intr->erdp_low, intr->erdp_hig= h); unsigned int dp_idx =3D (erdp - intr->er_start) / TRB_SIZE; if (erdp >=3D intr->er_start && @@ -3128,7 +2971,7 @@ static void xhci_runtime_write(void *ptr, hwaddr reg, } } break; - case 0x1c: /* ERDP high */ + case XHCI_INTR_REG_ERDP_HI: intr->erdp_high =3D val; break; default: @@ -3157,8 +3000,7 @@ static void xhci_doorbell_write(void *ptr, hwaddr reg, return; } =20 - reg >>=3D 2; - + reg /=3D XHCI_DBELL_DB_SZ; if (reg =3D=3D 0) { if (val =3D=3D 0) { xhci_process_commands(xhci); @@ -3251,11 +3093,11 @@ static void xhci_wakeup(USBPort *usbport) XHCIPort *port =3D xhci_lookup_port(xhci, usbport); =20 assert(port); - if (get_field(port->portsc, PORTSC_PLS) !=3D PLS_U3) { + if (get_field(port->portsc, XHCI_PORTSC_PLS) !=3D PLS_U3) { return; } - set_field(&port->portsc, PLS_RESUME, PORTSC_PLS); - xhci_port_notify(port, PORTSC_PLC); + set_field(&port->portsc, PLS_RESUME, XHCI_PORTSC_PLS); + xhci_port_notify(port, XHCI_PORTSC_PLC); } =20 static void xhci_complete(USBPort *port, USBPacket *packet) @@ -3342,7 +3184,7 @@ static void usb_xhci_init(XHCIState *xhci) XHCIPort *port; unsigned int i, usbports, speedmask; =20 - xhci->usbsts =3D USBSTS_HCH; + xhci->usbsts =3D XHCI_USBSTS_HCH; =20 if (xhci->numports_2 > XHCI_MAXPORTS_2) { xhci->numports_2 =3D XHCI_MAXPORTS_2; @@ -3430,10 +3272,10 @@ static void usb_xhci_realize(DeviceState *dev, Erro= r **errp) =20 for (i =3D 0; i < xhci->numports; i++) { XHCIPort *port =3D &xhci->ports[i]; - uint32_t offset =3D OFF_OPER + 0x400 + 0x10 * i; + uint32_t offset =3D OFF_OPER + 0x400 + XHCI_PORT_PR_SZ * i; port->xhci =3D xhci; memory_region_init_io(&port->mem, OBJECT(dev), &xhci_port_ops, por= t, - port->name, 0x10); + port->name, XHCI_PORT_PR_SZ); memory_region_add_subregion(&xhci->mem, offset, &port->mem); } } --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156862; cv=none; d=zohomail.com; s=zohoarc; b=BMILbw0Rq7XFeNI4TJmci5UuvRxl7JzlZs1mt2fBSDYW6WPKIpqGvMhRH+DpCQpgvOf91IlwDqUdGDsbDfpG2MH/Apq/azuLu6balBU0xik32L9NbxeYCOUSIGHqaRU53tTkn5ELWazcut3kbIBlLU+S1A2C/H8Q6UrdRe9ybrA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156862; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=9UUbXDpliZ02/3N9O1HJ431XFTCG4rNlhV3yHnCyQ4g=; b=Pbpkc83ZM5Ce+h8JJTbG0EawvepIdLnPOZqenCFop7OnbKkTCBFsKY/12ypoXqGGsJ6jJ6gKsvtKMNhMFZIouJEeUnPLWigznkPbizJwvgdBhd7Xj8ewHtfzThbPaanH7JHsGvBJqRbkTrmMGxIJUCCX8wQPQ4gMietmkZnjFsA= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156862767611.5978334784522; Thu, 1 May 2025 20:34:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7d-0004AW-Aa; Thu, 01 May 2025 23:31:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7K-00048P-3s for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:14 -0400 Received: from mail-pg1-x531.google.com ([2607:f8b0:4864:20::531]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7G-0001Em-H2 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:12 -0400 Received: by mail-pg1-x531.google.com with SMTP id 41be03b00d2f7-af28bc68846so1535986a12.1 for ; Thu, 01 May 2025 20:31:09 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156668; x=1746761468; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9UUbXDpliZ02/3N9O1HJ431XFTCG4rNlhV3yHnCyQ4g=; b=gX6kRNMrvsJQCvil+CB2CSqG/khnclgcAJfkcJOzHeF9pM2lkOdnP7rwkI9v97DI/g MBdTgTI++hi44A7KPsCDNhVCDHjGfgdQcynpsCTX2l4OQqsCbONrTqfLI+i7q262e82u XOIXgaOhATMlGjFQ7R4hxIULETOAx8+Qk7s5waxJkJ8zAL0ziNDJA2KayN20I3AmUjPY Ns1OYcvoR0yKZJ/bEERncgIwDX3blOlOy5vxWepLsT9Uc+16iR1sSdKTF/8YDVRm0bvV q4QoHA7KfzicV7+p80K1iXShw0qq+gdzcXQZ4Bk2dtnAfS35pbGOkK1YkkNrIK3LyocG JeIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156668; x=1746761468; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9UUbXDpliZ02/3N9O1HJ431XFTCG4rNlhV3yHnCyQ4g=; b=L3+qwZGkah6SpJg1ttyg3V7PD8x6jAfpGw5juas/DXHaD1Rtwp7rhKdx+W/2wqrgLH l2wI9MUaYXWNwmmnLuQuM+m0FSS4BC3E0ebHqfIOMSnFFZOYcVJy+9+tMkxc0ccwqOjb r8X0WjrA9zPk+CbUZZUBcWqnoD7Zrgu+cxRYVhz8LckLcp+fHQLTfnx3/xg/HfENzQaX qrZUN4GbmgmvLe1mYC61Z/j7N6+ufSDii5lhRUs4XiP5uMPATR0rXQxVXSY/kV9xbbCW ia4w1RzDUyxqO3IQcAm/0BU+TrycE8PGHkHudhVNUbg5vVPR38+I4wIzADc2GynLahh5 6bmA== X-Forwarded-Encrypted: i=1; AJvYcCUMnn9zizn3BEyjkA/teNHJ8ZXeEGhgq5Mel49pbrN0q3+pFg1qnnIGqK3V04VDihXJRdridcVMVfWz@nongnu.org X-Gm-Message-State: AOJu0YxrWUn5eYu3mjlv2U2p52J2QkqoXaUUcyoweWsCu9RxD5f2AzI6 l1m7gsVATYZQdq/HJ5vewchQVZ0Y6B6wW+l45Dc/jFuuC+Cz7vUW X-Gm-Gg: ASbGnctnpcYp2a+MzOyOKKlvo6142Wud1fpUM+Od8HXcEk3e2HE7klnOnDhETwpFXOP 7kG8xy4kpIZdZeme4bq+vIWtU5TfzmiOlZZtxWLSsb2FLA0moTDOc5fv/jNLZzu7DNIWMQhsV1L Hr1b4FCTcKC+4i0n8suXcs7LSOvgbdm/EHTQbtK2wyj9zf3IqdNURAO7QqWQXplrTVY566ljkf+ REyfQceCSNRxIgZOELw6jNoBsFP82zJvt/YxVajqPgG8vs+aWh1K3+A44vRVc5BHFJJDbY+FOgj z05AsfcghotuPe23m0eN5Et5CAyIITdAlg6+qLEBX3yE X-Google-Smtp-Source: AGHT+IHDYq3D43eOemzMYdrUBEugVRG7wda6TnW1nbgMUrLTU8rwJPmfotAxALoi75Sz/b7gQYGxpA== X-Received: by 2002:a05:6a20:2d26:b0:20c:92ea:1c0b with SMTP id adf61e73a8af0-20ce03e9377mr2173462637.35.1746156668341; Thu, 01 May 2025 20:31:08 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 02/22] hw/usb/xhci: Rename and move HCD register region constants to header Date: Fri, 2 May 2025 13:30:26 +1000 Message-ID: <20250502033047.102465-3-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::531; envelope-from=npiggin@gmail.com; helo=mail-pg1-x531.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156865599019100 Content-Type: text/plain; charset="utf-8" This also adds some missing constants rather than open-coding offsets and sizes. Signed-off-by: Nicholas Piggin --- hw/usb/hcd-xhci.h | 16 ++++++++++++++++ hw/usb/hcd-xhci.c | 48 ++++++++++++++++++++++------------------------- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/hw/usb/hcd-xhci.h b/hw/usb/hcd-xhci.h index ee364efd0ab..20059fcf66c 100644 --- a/hw/usb/hcd-xhci.h +++ b/hw/usb/hcd-xhci.h @@ -115,6 +115,22 @@ typedef enum TRBCCode { CC_SPLIT_TRANSACTION_ERROR } TRBCCode; =20 +/* Register regions */ +#define XHCI_REGS_LENGTH_CAP 0x40 +#define XHCI_REGS_LENGTH_OPER 0x400 +#define XHCI_REGS_LENGTH_PORT (XHCI_PORT_PR_SZ * XHCI_MAXPORTS) +#define XHCI_REGS_LENGTH_RUNTIME ((XHCI_MAXINTRS + 1) * XHCI_INTR_IR_S= Z) +/* XXX: Should doorbell length be *4 rather than *32? */ +#define XHCI_REGS_LENGTH_DOORBELL ((XHCI_MAXSLOTS + 1) * 0x20) + +#define XHCI_REGS_OFFSET_CAP 0 +#define XHCI_REGS_OFFSET_OPER (XHCI_REGS_OFFSET_CAP + \ + XHCI_REGS_LENGTH_CAP) +#define XHCI_REGS_OFFSET_PORT (XHCI_REGS_OFFSET_OPER + \ + XHCI_REGS_LENGTH_OPER) +#define XHCI_REGS_OFFSET_RUNTIME 0x1000 +#define XHCI_REGS_OFFSET_DOORBELL 0x2000 + /* Register definitions */ #define XHCI_HCCAP_REG_CAPLENGTH 0x00 #define XHCI_HCCAP_REG_HCIVERSION 0x02 diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index abd2002d2c0..c12b72cb9d8 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -46,22 +46,14 @@ #define COMMAND_LIMIT 256 #define TRANSFER_LIMIT 256 =20 -#define LEN_CAP 0x40 -#define LEN_OPER (0x400 + XHCI_PORT_PR_SZ * XHCI_MAXPORTS) -#define LEN_RUNTIME ((XHCI_MAXINTRS + 1) * XHCI_INTR_IR_SZ) -#define LEN_DOORBELL ((XHCI_MAXSLOTS + 1) * 0x20) - -#define OFF_OPER LEN_CAP -#define OFF_RUNTIME 0x1000 -#define OFF_DOORBELL 0x2000 - -#if (OFF_OPER + LEN_OPER) > OFF_RUNTIME -#error Increase OFF_RUNTIME +#if (XHCI_REGS_OFFSET_PORT + XHCI_REGS_LENGTH_PORT) > XHCI_REGS_OFFSET_RUN= TIME +#error Increase XHCI_REGS_OFFSET_RUNTIME #endif -#if (OFF_RUNTIME + LEN_RUNTIME) > OFF_DOORBELL -#error Increase OFF_DOORBELL +#if (XHCI_REGS_OFFSET_RUNTIME + XHCI_REGS_LENGTH_RUNTIME) > \ + XHCI_REGS_OFFSET_DOORBELL +#error Increase XHCI_REGS_OFFSET_DOORBELL #endif -#if (OFF_DOORBELL + LEN_DOORBELL) > XHCI_LEN_REGS +#if (XHCI_REGS_OFFSET_DOORBELL + XHCI_REGS_LENGTH_DOORBELL) > XHCI_LEN_REGS # error Increase XHCI_LEN_REGS #endif =20 @@ -2584,7 +2576,7 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg, = unsigned size) =20 switch (reg) { case XHCI_HCCAP_REG_CAPLENGTH: /* Covers HCIVERSION and CAPLENGTH */ - ret =3D 0x01000000 | LEN_CAP; + ret =3D 0x01000000 | XHCI_REGS_LENGTH_CAP; break; case XHCI_HCCAP_REG_HCSPARAMS1: ret =3D ((xhci->numports_2+xhci->numports_3)<<24) @@ -2604,10 +2596,10 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg= , unsigned size) } break; case XHCI_HCCAP_REG_DBOFF: - ret =3D OFF_DOORBELL; + ret =3D XHCI_REGS_OFFSET_DOORBELL; break; case XHCI_HCCAP_REG_RTSOFF: - ret =3D OFF_RUNTIME; + ret =3D XHCI_REGS_OFFSET_RUNTIME; break; =20 /* extended capabilities */ @@ -3257,22 +3249,26 @@ static void usb_xhci_realize(DeviceState *dev, Erro= r **errp) =20 memory_region_init(&xhci->mem, OBJECT(dev), "xhci", XHCI_LEN_REGS); memory_region_init_io(&xhci->mem_cap, OBJECT(dev), &xhci_cap_ops, xhci, - "capabilities", LEN_CAP); + "capabilities", XHCI_REGS_LENGTH_CAP); memory_region_init_io(&xhci->mem_oper, OBJECT(dev), &xhci_oper_ops, xh= ci, - "operational", 0x400); + "operational", XHCI_REGS_LENGTH_OPER); memory_region_init_io(&xhci->mem_runtime, OBJECT(dev), &xhci_runtime_o= ps, - xhci, "runtime", LEN_RUNTIME); + xhci, "runtime", XHCI_REGS_LENGTH_RUNTIME); memory_region_init_io(&xhci->mem_doorbell, OBJECT(dev), &xhci_doorbell= _ops, - xhci, "doorbell", LEN_DOORBELL); + xhci, "doorbell", XHCI_REGS_LENGTH_DOORBELL); =20 - memory_region_add_subregion(&xhci->mem, 0, &xhci->mem_cap); - memory_region_add_subregion(&xhci->mem, OFF_OPER, &xhci->mem_oper); - memory_region_add_subregion(&xhci->mem, OFF_RUNTIME, &xhci->mem_runti= me); - memory_region_add_subregion(&xhci->mem, OFF_DOORBELL, &xhci->mem_doorb= ell); + memory_region_add_subregion(&xhci->mem, XHCI_REGS_OFFSET_CAP, + &xhci->mem_cap); + memory_region_add_subregion(&xhci->mem, XHCI_REGS_OFFSET_OPER, + &xhci->mem_oper); + memory_region_add_subregion(&xhci->mem, XHCI_REGS_OFFSET_RUNTIME, + &xhci->mem_runtime); + memory_region_add_subregion(&xhci->mem, XHCI_REGS_OFFSET_DOORBELL, + &xhci->mem_doorbell); =20 for (i =3D 0; i < xhci->numports; i++) { XHCIPort *port =3D &xhci->ports[i]; - uint32_t offset =3D OFF_OPER + 0x400 + XHCI_PORT_PR_SZ * i; + uint32_t offset =3D XHCI_REGS_OFFSET_PORT + XHCI_PORT_PR_SZ * i; port->xhci =3D xhci; memory_region_init_io(&port->mem, OBJECT(dev), &xhci_port_ops, por= t, port->name, XHCI_PORT_PR_SZ); --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156934; cv=none; d=zohomail.com; s=zohoarc; b=dPUsWHXyf3/KmOt24sqXMNlbwzoY/07VN+k9w0NFG0+dpGm27b9R1xn44jNBTrkFz7ItDjp4LWmk20GtNgIS2ktsQTuQSLRLZOs3gvT/qupBDPhGlqraERGgiZeUnaE8n3vkvC8Fi6xyVCuyFjEZ6ABmBizWBX8i8n0JtkzBEbk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156934; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=+1L16zdFQs77EwxEGySwBuyx2+iOaiRonGPqPDTCnPA=; b=VPgk5/sxLq2uw1EpGstBcwcNWcowCLmTB+EahBWbp3Dp0Lnmh/5KkaetFHp/J+29aNVdleFoLCRutNeoKa/sWsyqDk9rXCvXyWiyi1HjRh2dwen76SrN1FrfGX03fzD4i8sDtPMxCjF6jVc2O+/YcpQ5wzMBbBq7cmOND9nurKg= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156934196592.6804023451684; Thu, 1 May 2025 20:35:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7m-0004CS-DM; Thu, 01 May 2025 23:31:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7R-000494-7p for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:23 -0400 Received: from mail-pf1-x432.google.com ([2607:f8b0:4864:20::432]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7M-0001F6-2z for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:18 -0400 Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-7376dd56eccso1884005b3a.0 for ; Thu, 01 May 2025 20:31:15 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156674; x=1746761474; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+1L16zdFQs77EwxEGySwBuyx2+iOaiRonGPqPDTCnPA=; b=B0Y2MHLknax4czKs/tULUZcQ+qDOVpMwkN6L8IWQ5JJFFJGYK4A+v4EyvX0YU7uoUz ctoy1GX2/gNdFsImn4ip4AfD7uKzDJ5bQL2nhMwnboT76Uy96Ywpry438r5s7VghwfHq bPl+mdAl3BI+fMg8mqfnCH+6jPPOj11TY2RJnj3Oaf4yuQLoGFxVNF027LWw3ViwxzC1 tsjDqC7qaRdmv8DRNI10RijpAzEJZrMX2sbjdqr02DhmpF2yJz+LKktwbo4BMDuiqgnK LaSzRIf4SIeBEB511MmES/fWUpgZiOl1IBSBkOyOpwaau69lKjEYiRErxxEZTA7mnppC 1EPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156674; x=1746761474; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+1L16zdFQs77EwxEGySwBuyx2+iOaiRonGPqPDTCnPA=; b=GqrQu75G/B5sBcFiPX9B1T8wTU7O3PK4VksLr7UqIrSlchBRc1YOEp7/upyLyF7EGt Nl/BzDQt8iIEVhZ+pliiiFz2IpBMz3onXkcaFoWzTwrto9jD2I8/H5hhiurl9XSW1U8q mD9H+Jl4TEKs1nF4hkWubKbNilI68/d/Zj25MBb7NmpL1Sv1Udlg2IyJy3lzHl94TJUp VELz3uItCMb7m88tTnP/gGmo5e+6eXO/jW5NUleIb+N4tso/AwU77ZGxDxmA7KNbNPRr aklSvlWEohSKFUGCYu3Fpm5QS5SucsqdoOR/OZO1NR000rVKvG4TlbMJoaRC7YDPvrEs HtxA== X-Forwarded-Encrypted: i=1; AJvYcCWSyKXI07E4AMX9M1gRiBQSayPVWtSkE8dS3nIvJrEFn2sVm5Zt1RLWCD+51orNZqjNgjPz/0LuKoqa@nongnu.org X-Gm-Message-State: AOJu0YwXIu99mJXOC3MPl1EYhb7MLqaj8ZACKJ1hc855GO4H5Ni4mbsh 0k20huCo8FH/rNDFiYOQU3rsVAHJ9PfFDvKCgoH9qWyK50Vid/u6 X-Gm-Gg: ASbGncvKMZVgZJ0BRz+nx6iknmvTRQOcYhrPO/BLICh9yfJUc1DSMltwwCK6oNXjM3F xwuI7P8T53zimpLBljgS7kHC8x1uC9jvGXsbrQBXMgDeddkbbItlH+jtvrXdLyAgwfGwgFPpiwo zJZWS2uuLTxQK4GDT3iV67ir5EiezmHLJiR1xOcYyF0+asvSk2WxjeM9p2w9jZy+BAI8sDmQ0GW dXX8lTMao4+TJBuC7xAu+cMEkguNp9dMAkinVvDSYQy7w8Z/TWzJ5wXo7rsSKxUVbHyelyZoukI mrES19wyV4RtKLhOU5EbVir7bdI3ZRCb0Xw/TJPgvX8TOabcssmmpuk= X-Google-Smtp-Source: AGHT+IF2ygvBhapplJ2/l9wvnLvHz6gJJsBuV+BPWjqxd1zsL2B0vwZagCqqbVhV+BOvIEkQIGlDjA== X-Received: by 2002:a05:6a20:c6cb:b0:1f5:64fd:68ea with SMTP id adf61e73a8af0-20cde46cd69mr1986468637.4.1746156674097; Thu, 01 May 2025 20:31:14 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 03/22] tests/qtest/xhci: test the qemu-xhci device Date: Fri, 2 May 2025 13:30:27 +1000 Message-ID: <20250502033047.102465-4-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::432; envelope-from=npiggin@gmail.com; helo=mail-pf1-x432.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156935681019100 Content-Type: text/plain; charset="utf-8" Add support in the test code for running multiple drivers, and add tests for the qemu-xhci device. Signed-off-by: Nicholas Piggin Reviewed-by: Fabiano Rosas --- tests/qtest/usb-hcd-xhci-test.c | 190 +++++++++++++++++++++++++++++--- 1 file changed, 176 insertions(+), 14 deletions(-) diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index 0cccfd85a64..abdd52c444c 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -8,17 +8,147 @@ */ =20 #include "qemu/osdep.h" +#include "libqtest.h" #include "libqtest-single.h" +#include "libqos/libqos.h" +#include "libqos/libqos-pc.h" #include "libqos/usb.h" +#include "hw/pci/pci.h" +#include "hw/pci/pci_ids.h" =20 -static void test_xhci_hotplug(void) +typedef struct TestData { + const char *device; + uint32_t fingerprint; +} TestData; + +/*** Test Setup & Teardown ***/ +typedef struct XHCIQState { + /* QEMU PCI variables */ + QOSState *parent; + QPCIDevice *dev; + QPCIBar bar; + uint64_t barsize; + uint32_t fingerprint; +} XHCIQState; + +#define XHCI_QEMU_ID (PCI_DEVICE_ID_REDHAT_XHCI << 16 | \ + PCI_VENDOR_ID_REDHAT) +#define XHCI_NEC_ID (PCI_DEVICE_ID_NEC_UPD720200 << 16 | \ + PCI_VENDOR_ID_NEC) + +/** + * Locate, verify, and return a handle to the XHCI device. + */ +static QPCIDevice *get_xhci_device(QTestState *qts) +{ + QPCIDevice *xhci; + QPCIBus *pcibus; + + pcibus =3D qpci_new_pc(qts, NULL); + + /* Find the XHCI PCI device and verify it's the right one. */ + xhci =3D qpci_device_find(pcibus, QPCI_DEVFN(0x1D, 0x0)); + g_assert(xhci !=3D NULL); + + return xhci; +} + +static void free_xhci_device(QPCIDevice *dev) +{ + QPCIBus *pcibus =3D dev ? dev->bus : NULL; + + /* libqos doesn't have a function for this, so free it manually */ + g_free(dev); + qpci_free_pc(pcibus); +} + +/** + * Start a Q35 machine and bookmark a handle to the XHCI device. + */ +G_GNUC_PRINTF(1, 0) +static XHCIQState *xhci_vboot(const char *cli, va_list ap) +{ + XHCIQState *s; + + s =3D g_new0(XHCIQState, 1); + s->parent =3D qtest_pc_vboot(cli, ap); + alloc_set_flags(&s->parent->alloc, ALLOC_LEAK_ASSERT); + + /* Verify that we have an XHCI device present. */ + s->dev =3D get_xhci_device(s->parent->qts); + s->fingerprint =3D qpci_config_readl(s->dev, PCI_VENDOR_ID); + s->bar =3D qpci_iomap(s->dev, 0, &s->barsize); + /* turns on pci.cmd.iose, pci.cmd.mse and pci.cmd.bme */ + qpci_device_enable(s->dev); + + return s; +} + +/** + * Start a Q35 machine and bookmark a handle to the XHCI device. + */ +G_GNUC_PRINTF(1, 2) +static XHCIQState *xhci_boot(const char *cli, ...) +{ + XHCIQState *s; + va_list ap; + + va_start(ap, cli); + s =3D xhci_vboot(cli, ap); + va_end(ap); + + return s; +} + +static XHCIQState *xhci_boot_dev(const char *device, uint32_t fingerprint) +{ + XHCIQState *s; + + s =3D xhci_boot("-M q35 " + "-device %s,id=3Dxhci,bus=3Dpcie.0,addr=3D1d.0 " + "-drive id=3Ddrive0,if=3Dnone,file=3Dnull-co://," + "file.read-zeroes=3Don,format=3Draw", device); + g_assert_cmphex(s->fingerprint, =3D=3D, fingerprint); + + return s; +} + +/** + * Clean up the PCI device, then terminate the QEMU instance. + */ +static void xhci_shutdown(XHCIQState *xhci) +{ + QOSState *qs =3D xhci->parent; + + free_xhci_device(xhci->dev); + g_free(xhci); + qtest_shutdown(qs); +} + +/*** tests ***/ + +static void test_xhci_hotplug(const void *arg) { - usb_test_hotplug(global_qtest, "xhci", "1", NULL); + const TestData *td =3D arg; + XHCIQState *s; + QTestState *qts; + + s =3D xhci_boot_dev(td->device, td->fingerprint); + qts =3D s->parent->qts; + + usb_test_hotplug(qts, "xhci", "1", NULL); + + xhci_shutdown(s); } =20 -static void test_usb_uas_hotplug(void) +static void test_usb_uas_hotplug(const void *arg) { - QTestState *qts =3D global_qtest; + const TestData *td =3D arg; + XHCIQState *s; + QTestState *qts; + + s =3D xhci_boot_dev(td->device, td->fingerprint); + qts =3D s->parent->qts; =20 qtest_qmp_device_add(qts, "usb-uas", "uas", "{}"); qtest_qmp_device_add(qts, "scsi-hd", "scsihd", "{'drive': 'drive0'}"); @@ -32,9 +162,14 @@ static void test_usb_uas_hotplug(void) qtest_qmp_device_del(qts, "uas"); } =20 -static void test_usb_ccid_hotplug(void) +static void test_usb_ccid_hotplug(const void *arg) { - QTestState *qts =3D global_qtest; + const TestData *td =3D arg; + XHCIQState *s; + QTestState *qts; + + s =3D xhci_boot_dev(td->device, td->fingerprint); + qts =3D s->parent->qts; =20 qtest_qmp_device_add(qts, "usb-ccid", "ccid", "{}"); qtest_qmp_device_del(qts, "ccid"); @@ -43,23 +178,50 @@ static void test_usb_ccid_hotplug(void) qtest_qmp_device_del(qts, "ccid"); } =20 +static void add_test(const char *name, TestData *td, void (*fn)(const void= *)) +{ + g_autofree char *full_name =3D g_strdup_printf( + "/xhci/pci/%s/%s", td->device, name); + qtest_add_data_func(full_name, td, fn); +} + +static void add_tests(TestData *td) +{ + add_test("hotplug", td, test_xhci_hotplug); + if (qtest_has_device("usb-uas")) { + add_test("usb-uas", td, test_usb_uas_hotplug); + } + if (qtest_has_device("usb-ccid")) { + add_test("usb-ccid", td, test_usb_ccid_hotplug); + } +} + +/* tests */ int main(int argc, char **argv) { int ret; + const char *arch; + int i; + TestData td[] =3D { + { .device =3D "qemu-xhci", .fingerprint =3D XHCI_QEMU_ID, }, + { .device =3D "nec-usb-xhci", .fingerprint =3D XHCI_NEC_ID, }, + }; =20 g_test_init(&argc, &argv, NULL); =20 - qtest_add_func("/xhci/pci/hotplug", test_xhci_hotplug); - if (qtest_has_device("usb-uas")) { - qtest_add_func("/xhci/pci/hotplug/usb-uas", test_usb_uas_hotplug); + /* Check architecture */ + arch =3D qtest_get_arch(); + if (strcmp(arch, "i386") && strcmp(arch, "x86_64")) { + g_test_message("Skipping test for non-x86"); + return 0; } - if (qtest_has_device("usb-ccid")) { - qtest_add_func("/xhci/pci/hotplug/usb-ccid", test_usb_ccid_hotplug= ); + + for (i =3D 0; i < ARRAY_SIZE(td); i++) { + if (qtest_has_device(td[i].device)) { + add_tests(&td[i]); + } } =20 - qtest_start("-device nec-usb-xhci,id=3Dxhci" - " -drive id=3Ddrive0,if=3Dnone,file=3Dnull-co://," - "file.read-zeroes=3Don,format=3Draw"); ret =3D g_test_run(); qtest_end(); =20 --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156849; cv=none; d=zohomail.com; s=zohoarc; b=YVOiPkSbhFLG+fKpTVa5kCd0KWWDhiwfvujMyxtuZxLErMu0yOwR31bWSFA9b7Ven2oGawwo/3gp2eHuR3dYZ5NwP7xuLj/yUADOx838TeClNTnrcyrLPWJj2j+73LMDBC4CT60prtgBkG2l1nbMkWHFDoiZhmvLDd5ApsrttUY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156849; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=pyx6RarOeQbfyFAQ0Udrqez9p+XhUS2Q4KG6PVcPYIE=; b=Q3tMT/JTVh7jfKJOaqPpxDe0NUkf/qHk5BQ5ybZYWzZLA/EI7Kh1ewc1upBrGXR0xm5xeonWwtSbnky2BzYyW3YEcLO6N/RQlekHn+hvHKN33mvE5xRXfXaFbCIarOBrBzMmPWTrOHIYDsRA+pRjtT5YYIylSHqd2PJmkl/Yb8k= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156849133181.52922308528048; Thu, 1 May 2025 20:34:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7l-0004CO-2T; Thu, 01 May 2025 23:31:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7T-00049I-LZ for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:28 -0400 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7R-0001FQ-0K for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:23 -0400 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-736c1138ae5so1710947b3a.3 for ; Thu, 01 May 2025 20:31:20 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156679; x=1746761479; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=pyx6RarOeQbfyFAQ0Udrqez9p+XhUS2Q4KG6PVcPYIE=; b=Gf2qCGigkrjIQU24mauowtQUpJn6ZvyVukQjAIuDPecBde4NK0iKR2yW5EKywPJrNR bdhYVSDFQpw8CB5jHu/pi8eoG6nKS44IMK1NHQJMXToVK1/gFOT+fOdEuXJrSkOERQyS 7kqYCL8ZLMqirVPnMMQyggXZWGKJP8HlLYaQZnsHMqmwUJtA06A6YECLr74R27Q/eBHT p9mhhbCb1tDsqNxRYA6apRrvUGOF4bRiljSZKi0Ps8a25FLcoHvrTGoy9v6To3/vVsPY TY84DmJNKKpRXZDuYEJ2k74xV5pwhscujFDOIa4eBBiHAd4wpW9f/SYz0P2vVjElTEmC 6KUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156679; x=1746761479; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pyx6RarOeQbfyFAQ0Udrqez9p+XhUS2Q4KG6PVcPYIE=; b=m6y1gvKiQPZD884GH6kRldObBTGtOLS2FimEcExagoTW6Gix6+nKCwMubC5sQaj1/v zr9pP/49q6XjlKsrFJRIQx5JqyIdUehpFrr70QS5YjCeTUfGzqjswD0LZyjNiQgwCDW+ MWvKzu0X3sNueghZPHVbNcBXrYHMqftkCAQAagmQQ0isu9FyC8IlmvtKnG51/xLwJk9e TZ4Rfo8ySukVEU/eAxBlzAT1yaUnHxgKN4mfCTWrl2Tdq4bvhNPwpgRVLamM+TYDcJ0Y bhpj6FGJqjx+T2PMe07CPVuGzFYMFbVVEtM5zrOvlUg6dQfiyhgz+96CfbCmxQjET1lj gayw== X-Forwarded-Encrypted: i=1; AJvYcCUGnaH1y3RpPyLz8ae2DOc8YpkdWpTxra8zv+QPhOD5OzmbvUEL1EVIWvXap8ywjUS8u8Gv6At9t1gJ@nongnu.org X-Gm-Message-State: AOJu0Yxb/81Q9ST+5FWg1jQyOkaAPU7/uDasXSmGXQmdWo54J6ntdRvT UmQwvSuunqWMs5j5JLNh7eRyuWWA0sjT2NNw0dNcOoST4HoqcmKL X-Gm-Gg: ASbGncs1D6LWUpm+JMf5d/zhrc96hWlDP/zKZcT6R6m8D/9U5EVRNQX3B5XE/8NUIv5 OOlzSrpCP/vZ9sKPG3eYOnBG8TeKBPWhQp1hf9Zn74gmeVKjgapPYZBRU7Y5NyR4K9WyPUFxp6H MnLt8Zidng2zg+lzNm/DIBCQ1dwDVkcvzVZIuAY6vXc/SL4jf+h7f1pkKJqSggk9acUQVcrfkFQ zIYZg1go9JEKA9XGBuUhhkHU7UYsdqdlNcaOGe31eewmJuaWEbScQZvJgPNRDokOdmdxWdy8sm7 6UozkNHosn+D1216w4yqvlJx9vspjEM6WUfJt0yb1WQc X-Google-Smtp-Source: AGHT+IH4BJN80gWH8MS7zfoXc/RelSfvAIuXQSqmVphRO0k92l9u45dj1o7POMFYQKK7zNkHcrmsUw== X-Received: by 2002:aa7:8e0e:0:b0:740:595b:c2f4 with SMTP id d2e1a72fcca58-740595bc464mr1049281b3a.5.1746156679286; Thu, 01 May 2025 20:31:19 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 04/22] tests/qtest/xhci: Add controller and device setup and ring tests Date: Fri, 2 May 2025 13:30:28 +1000 Message-ID: <20250502033047.102465-5-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::431; envelope-from=npiggin@gmail.com; helo=mail-pf1-x431.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156851462019100 Content-Type: text/plain; charset="utf-8" Add tests which init the host controller registers to the point where command and event rings, irqs are operational. Enumerate ports and set up an attached device context that enables device transfer ring to be set up and tested. Signed-off-by: Nicholas Piggin Reviewed-by: Fabiano Rosas --- hw/usb/hcd-xhci.h | 7 + hw/usb/hcd-xhci.c | 7 - tests/qtest/usb-hcd-xhci-test.c | 336 ++++++++++++++++++++++++++++++++ 3 files changed, 343 insertions(+), 7 deletions(-) diff --git a/hw/usb/hcd-xhci.h b/hw/usb/hcd-xhci.h index 20059fcf66c..02a005ce78d 100644 --- a/hw/usb/hcd-xhci.h +++ b/hw/usb/hcd-xhci.h @@ -350,6 +350,13 @@ typedef struct XHCIRing { bool ccs; } XHCIRing; =20 +typedef struct XHCIEvRingSeg { + uint32_t addr_low; + uint32_t addr_high; + uint32_t size; + uint32_t rsvd; +} XHCIEvRingSeg; + typedef struct XHCIPort { XHCIState *xhci; uint32_t portsc; diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index c12b72cb9d8..ef9f2a7db41 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -128,13 +128,6 @@ struct XHCIEPContext { QEMUTimer *kick_timer; }; =20 -typedef struct XHCIEvRingSeg { - uint32_t addr_low; - uint32_t addr_high; - uint32_t size; - uint32_t rsvd; -} XHCIEvRingSeg; - static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid, unsigned int streamid); static void xhci_kick_epctx(XHCIEPContext *epctx, unsigned int streamid); diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index abdd52c444c..291d1dfc36e 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -8,6 +8,7 @@ */ =20 #include "qemu/osdep.h" +#include "qemu/bswap.h" #include "libqtest.h" #include "libqtest-single.h" #include "libqos/libqos.h" @@ -15,6 +16,8 @@ #include "libqos/usb.h" #include "hw/pci/pci.h" #include "hw/pci/pci_ids.h" +#include "hw/pci/pci_regs.h" +#include "hw/usb/hcd-xhci.h" =20 typedef struct TestData { const char *device; @@ -22,6 +25,22 @@ typedef struct TestData { } TestData; =20 /*** Test Setup & Teardown ***/ + +/* Transfer-Ring state */ +typedef struct XHCIQTRState { + uint64_t addr; /* In-memory ring */ + + uint32_t trb_entries; + uint32_t trb_idx; + uint32_t trb_c; +} XHCIQTRState; + +typedef struct XHCIQSlotState { + /* In-memory device context array */ + uint64_t device_context; + XHCIQTRState transfer_ring[31]; /* 1 for each EP */ +} XHCIQSlotState; + typedef struct XHCIQState { /* QEMU PCI variables */ QOSState *parent; @@ -29,6 +48,21 @@ typedef struct XHCIQState { QPCIBar bar; uint64_t barsize; uint32_t fingerprint; + + /* In-memory arrays */ + uint64_t dc_base_array; + uint64_t event_ring_seg; + XHCIQTRState command_ring; + XHCIQTRState event_ring; + + /* Host controller properties */ + uint32_t rtoff, dboff; + uint32_t maxports, maxslots, maxintrs; + + /* Current properties */ + uint32_t slotid; /* enabled slot id (only enable one) */ + + XHCIQSlotState slots[32]; } XHCIQState; =20 #define XHCI_QEMU_ID (PCI_DEVICE_ID_REDHAT_XHCI << 16 | \ @@ -160,6 +194,8 @@ static void test_usb_uas_hotplug(const void *arg) =20 qtest_qmp_device_del(qts, "scsihd"); qtest_qmp_device_del(qts, "uas"); + + xhci_shutdown(s); } =20 static void test_usb_ccid_hotplug(const void *arg) @@ -176,6 +212,305 @@ static void test_usb_ccid_hotplug(const void *arg) /* check the device can be added again */ qtest_qmp_device_add(qts, "usb-ccid", "ccid", "{}"); qtest_qmp_device_del(qts, "ccid"); + + xhci_shutdown(s); +} + +static uint64_t xhci_guest_zalloc(XHCIQState *s, uint64_t size) +{ + uint64_t ret; + + ret =3D guest_alloc(&s->parent->alloc, size); + g_assert(ret); + qtest_memset(s->parent->qts, ret, 0, size); + + return ret; +} + +static uint32_t xhci_cap_readl(XHCIQState *s, uint64_t addr) +{ + return qpci_io_readl(s->dev, s->bar, XHCI_REGS_OFFSET_CAP + addr); +} + +static uint32_t xhci_op_readl(XHCIQState *s, uint64_t addr) +{ + return qpci_io_readl(s->dev, s->bar, XHCI_REGS_OFFSET_OPER + addr); +} + +static void xhci_op_writel(XHCIQState *s, uint64_t addr, uint32_t value) +{ + qpci_io_writel(s->dev, s->bar, XHCI_REGS_OFFSET_OPER + addr, value); +} + +static uint32_t xhci_port_readl(XHCIQState *s, uint32_t port, uint64_t add= r) +{ + return qpci_io_readl(s->dev, s->bar, + XHCI_REGS_OFFSET_PORT + port * XHCI_PORT_PR_SZ + = addr); +} + +static uint32_t xhci_rt_readl(XHCIQState *s, uint64_t addr) +{ + return qpci_io_readl(s->dev, s->bar, s->rtoff + addr); +} + +static void xhci_rt_writel(XHCIQState *s, uint64_t addr, uint32_t value) +{ + qpci_io_writel(s->dev, s->bar, s->rtoff + addr, value); +} + +static uint32_t xhci_intr_readl(XHCIQState *s, uint32_t intr, uint64_t add= r) +{ + return xhci_rt_readl(s, XHCI_INTR_REG_IR0 + + intr * XHCI_INTR_IR_SZ + addr); +} + + +static void xhci_intr_writel(XHCIQState *s, uint32_t intr, uint64_t addr, + uint32_t value) +{ + xhci_rt_writel(s, XHCI_INTR_REG_IR0 + + intr * XHCI_INTR_IR_SZ + addr, value); +} + +static void xhci_db_writel(XHCIQState *s, uint32_t db, uint32_t value) +{ + qpci_io_writel(s->dev, s->bar, s->dboff + db * XHCI_DBELL_DB_SZ, value= ); +} + +static bool xhci_test_isr(XHCIQState *s) +{ + return xhci_op_readl(s, XHCI_OPER_REG_USBSTS) & XHCI_USBSTS_EINT; +} + +static void wait_event_trb(XHCIQState *s, XHCITRB *trb) +{ + XHCITRB t; + XHCIQTRState *tr =3D &s->event_ring; + uint64_t er_addr =3D tr->addr + tr->trb_idx * TRB_SIZE; + uint32_t value; + guint64 end_time =3D g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND; + + /* Wait for event interrupt */ + while (!xhci_test_isr(s)) { + if (g_get_monotonic_time() >=3D end_time) { + g_error("Timeout expired"); + } + qtest_clock_step(s->parent->qts, 10000); + } + + /* With MSI-X enabled, IMAN IP is cleared after raising the interrupt = */ + value =3D xhci_intr_readl(s, 0, XHCI_INTR_REG_IMAN); + g_assert(!(value & XHCI_IMAN_IP)); + + xhci_op_writel(s, XHCI_OPER_REG_USBSTS, XHCI_USBSTS_EINT); /* clear EI= NT */ + + qtest_memread(s->parent->qts, er_addr, &t, TRB_SIZE); + + trb->parameter =3D le64_to_cpu(t.parameter); + trb->status =3D le32_to_cpu(t.status); + trb->control =3D le32_to_cpu(t.control); + + g_assert((trb->status >> 24) =3D=3D CC_SUCCESS); + g_assert((trb->control & TRB_C) =3D=3D tr->trb_c); /* C bit has been s= et */ + + tr->trb_idx++; + if (tr->trb_idx =3D=3D tr->trb_entries) { + tr->trb_idx =3D 0; + tr->trb_c ^=3D 1; + } + /* Update ERDP to processed TRB addr and EHB bit, which clears EHB */ + er_addr =3D tr->addr + tr->trb_idx * TRB_SIZE; + xhci_intr_writel(s, 0, XHCI_INTR_REG_ERDP_LO, + (er_addr & 0xffffffff) | XHCI_ERDP_EHB); +} + +static void set_link_trb(XHCIQState *s, uint64_t ring, uint32_t c, + uint32_t entries) +{ + XHCITRB trb; + + g_assert(entries > 1); + + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D ring; + trb.control =3D cpu_to_le32(c | /* C */ + (TR_LINK << TRB_TYPE_SHIFT) | + TRB_LK_TC); + qtest_memwrite(s->parent->qts, ring + TRB_SIZE * (entries - 1), + &trb, TRB_SIZE); +} + +static uint64_t queue_trb(XHCIQState *s, XHCIQTRState *tr, const XHCITRB *= trb) +{ + uint64_t tr_addr =3D tr->addr + tr->trb_idx * TRB_SIZE; + XHCITRB t; + + t.parameter =3D cpu_to_le64(trb->parameter); + t.status =3D cpu_to_le32(trb->status); + t.control =3D cpu_to_le32(trb->control | tr->trb_c); + + qtest_memwrite(s->parent->qts, tr_addr, &t, TRB_SIZE); + tr->trb_idx++; + /* Last entry contains the link, so wrap back */ + if (tr->trb_idx =3D=3D tr->trb_entries - 1) { + set_link_trb(s, tr->addr, tr->trb_c, tr->trb_entries); + tr->trb_idx =3D 0; + tr->trb_c ^=3D 1; + } + + return tr_addr; +} + +static uint64_t submit_cr_trb(XHCIQState *s, const XHCITRB *trb) +{ + XHCIQTRState *tr =3D &s->command_ring; + uint64_t ret; + + ret =3D queue_trb(s, tr, trb); + + xhci_db_writel(s, 0, 0); /* doorbell host, doorbell 0 (command) */ + + return ret; +} + +static void xhci_enable_device(XHCIQState *s) +{ + XHCIQTRState *tr; + XHCIEvRingSeg ev_seg; + uint32_t hcsparams1; + uint32_t value; + int i; + + qpci_msix_enable(s->dev); + + hcsparams1 =3D xhci_cap_readl(s, XHCI_HCCAP_REG_HCSPARAMS1); + s->maxports =3D (hcsparams1 >> 24) & 0xff; + s->maxintrs =3D (hcsparams1 >> 8) & 0x3ff; + s->maxslots =3D hcsparams1 & 0xff; + + s->dboff =3D xhci_cap_readl(s, XHCI_HCCAP_REG_DBOFF); + s->rtoff =3D xhci_cap_readl(s, XHCI_HCCAP_REG_RTSOFF); + + s->dc_base_array =3D xhci_guest_zalloc(s, 0x800); + s->event_ring_seg =3D xhci_guest_zalloc(s, 0x100); + + /* Arbitrary small sizes so we can make them wrap */ + tr =3D &s->command_ring; + tr->addr =3D xhci_guest_zalloc(s, 0x1000); + tr->trb_entries =3D 0x20; + tr->trb_c =3D 1; + + tr =3D &s->event_ring; + tr->addr =3D xhci_guest_zalloc(s, 0x1000); + tr->trb_entries =3D 0x10; + tr->trb_c =3D 1; + + tr =3D &s->event_ring; + ev_seg.addr_low =3D cpu_to_le32(tr->addr & 0xffffffff); + ev_seg.addr_high =3D cpu_to_le32(tr->addr >> 32); + ev_seg.size =3D cpu_to_le32(tr->trb_entries); + ev_seg.rsvd =3D 0; + qtest_memwrite(s->parent->qts, s->event_ring_seg, &ev_seg, sizeof(ev_s= eg)); + + xhci_op_writel(s, XHCI_OPER_REG_USBCMD, XHCI_USBCMD_HCRST); + do { + value =3D xhci_op_readl(s, XHCI_OPER_REG_USBSTS); + } while (value & XHCI_USBSTS_CNR); + + xhci_op_writel(s, XHCI_OPER_REG_CONFIG, s->maxslots); + + xhci_op_writel(s, XHCI_OPER_REG_DCBAAP_LO, s->dc_base_array & 0xffffff= ff); + xhci_op_writel(s, XHCI_OPER_REG_DCBAAP_HI, s->dc_base_array >> 32); + + tr =3D &s->command_ring; + xhci_op_writel(s, XHCI_OPER_REG_CRCR_LO, + (tr->addr & 0xffffffff) | tr->trb_c); + xhci_op_writel(s, XHCI_OPER_REG_CRCR_HI, tr->addr >> 32); + + xhci_intr_writel(s, 0, XHCI_INTR_REG_ERSTSZ, 1); + + xhci_intr_writel(s, 0, XHCI_INTR_REG_ERSTBA_LO, + s->event_ring_seg & 0xffffffff); + xhci_intr_writel(s, 0, XHCI_INTR_REG_ERSTBA_HI, + s->event_ring_seg >> 32); + + /* ERDP */ + tr =3D &s->event_ring; + xhci_intr_writel(s, 0, XHCI_INTR_REG_ERDP_LO, tr->addr & 0xffffffff); + xhci_intr_writel(s, 0, XHCI_INTR_REG_ERDP_HI, tr->addr >> 32); + + xhci_op_writel(s, XHCI_OPER_REG_USBCMD, XHCI_USBCMD_RS | XHCI_USBCMD_I= NTE); + + /* Enable interrupts on ER IMAN */ + xhci_intr_writel(s, 0, XHCI_INTR_REG_IMAN, XHCI_IMAN_IE); + + /* Ensure there is no interrupt pending */ + g_assert(!xhci_test_isr(s)); + + /* Query ports */ + for (i =3D 0; i < s->maxports; i++) { + value =3D xhci_port_readl(s, i, 0); /* PORTSC */ + + /* All ports should be disabled */ + g_assert(!(value & XHCI_PORTSC_CCS)); + g_assert(!(value & XHCI_PORTSC_PED)); + g_assert(((value >> XHCI_PORTSC_PLS_SHIFT) & + XHCI_PORTSC_PLS_MASK) =3D=3D 5); + } +} + +static void xhci_disable_device(XHCIQState *s) +{ + int i; + + /* Shut it down */ + qpci_msix_disable(s->dev); + + guest_free(&s->parent->alloc, s->slots[s->slotid].device_context); + for (i =3D 0; i < 31; i++) { + guest_free(&s->parent->alloc, + s->slots[s->slotid].transfer_ring[i].addr); + } + guest_free(&s->parent->alloc, s->event_ring.addr); + guest_free(&s->parent->alloc, s->command_ring.addr); + guest_free(&s->parent->alloc, s->event_ring_seg); + guest_free(&s->parent->alloc, s->dc_base_array); +} + +/* + * This test brings up an endpoint and runs some noops through its command + * ring and gets responses back on the event ring, then brings up a device + * context and runs some noops through its transfer ring (if available). + */ +static void test_xhci_stress_rings(const void *arg) +{ + const TestData *td =3D arg; + XHCIQState *s; + XHCITRB trb; + uint64_t tag; + int i; + + s =3D xhci_boot("-M q35 " + "-device %s,id=3Dxhci,bus=3Dpcie.0,addr=3D1d.0 ", + td->device); + g_assert_cmphex(s->fingerprint, =3D=3D, td->fingerprint); + + xhci_enable_device(s); + + /* Wrap the command and event rings with no-ops a few times */ + for (i =3D 0; i < 100; i++) { + /* Issue a command ring no-op */ + memset(&trb, 0, TRB_SIZE); + trb.control |=3D CR_NOOP << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_cr_trb(s, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter , =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_COMMAND_COMPLETE); + } + + xhci_disable_device(s); + xhci_shutdown(s); } =20 static void add_test(const char *name, TestData *td, void (*fn)(const void= *)) @@ -194,6 +529,7 @@ static void add_tests(TestData *td) if (qtest_has_device("usb-ccid")) { add_test("usb-ccid", td, test_usb_ccid_hotplug); } + add_test("xhci-stress-rings", td, test_xhci_stress_rings); } =20 /* tests */ --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156719; cv=none; d=zohomail.com; s=zohoarc; b=JfvFEQ81xVBSU7BSoFUJ97arwJy/FMX9QNHjWqIieBxAs7tKkZ21FFOHLqOecXxygLQNDbIoaGN2FF4mTJt5GvVwnOTkalJbNoFuD+49urWBGuHdhyAhJTTng0wlKJhZCBIe410Ng8wpuGTet3suXFJIjtGkDJ98el6WidvuXME= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156719; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=NM7HJOh9v000gUzrupe4wLfC+e8cJXJMVS97llbap5s=; b=m0dCIsJfsSKm0o7LyJ9BtHT0UaHSOhGu7WGHfi4tUwrux9TFrPPuIsU9uey2cwF4T1g5wuTDeCnRYRG0uQvfgPnl8hm4X8qV6fmE6cBQqcMS3s0k8ZUP7X41T5ufMGE8ZLsUTdRllODacdA26xxq7yqKZlpyRR6yUFFYZdfhdYk= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156719124136.9051969851297; Thu, 1 May 2025 20:31:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7i-0004Bh-3S; Thu, 01 May 2025 23:31:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7a-0004AE-Nc for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:32 -0400 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7V-0001G7-Vg for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:30 -0400 Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-7403f3ece96so2262977b3a.0 for ; Thu, 01 May 2025 20:31:25 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156684; x=1746761484; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NM7HJOh9v000gUzrupe4wLfC+e8cJXJMVS97llbap5s=; b=NK2WYSPpt/wHo19iD2SoehlQG4i1bbmKw6QHoaWj/xEk6rYEuaYTWm5/AE74eZQiHM ujJgbvczuaQGxGR3NP7vRzsR2aZsDx+rwS+WomSZVXaiBJj9b5DD43Pk+Xuj9agECqGv 5WKSZwD6ZP1NLBRk/k2O1SIKC31nrAKT0RdWS4aVTZcMYeSPMFvklrOlzQKfMdRkFNcu THzePEvTX4TP6iyE+LI+tIZgX8vJdwT+EsMQ4OAld29K2hulGE/SuwlgxWfptDATCr44 VQAYyIDSME+EbQlt61ofQmuYWgizNlkYazKb/w0+BkhHtz2lGdRqhVZCNX0L44cfbVSU 7Oqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156684; x=1746761484; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NM7HJOh9v000gUzrupe4wLfC+e8cJXJMVS97llbap5s=; b=YI0y1N+0RNnYPSKEgW0yl+lxNfmj8vG/EPaeAZKdJpu04c1iBpjjuQmZ9O7K1V5ToM C8a8kl1KVoqAP3oANrVcBmmDjewwHCaUQzeKD9MwDdFUOeT3EzP4Cxs4FbgxzC4zXMSN hu0OZAE1qF1SfxOD8+LN9Tnxv/DnMFdyrG+XqK9lPujDdbD6ulJFmU+aC7RAI9PLFKkN BC7okD0M7KfzEAMuEa664Ni2//3i4mTdaRzKL3xomtJGoAeOJDYt3ruNJRZjOvrSyCr1 6ux1cJ8iz9jzVwuvNKkqAx65a8yWEiHWjwnbkDS3aYIxo5BV6744rxLf9I0hjRSkifFj oPhg== X-Forwarded-Encrypted: i=1; AJvYcCUL8Q1WSdqRhBIsdNgb1lKUj3F4dKHMIj7ABcJF5O8G0fbdN+KYZpNzHk4t71c1nLN6gU62+N/V+Rkt@nongnu.org X-Gm-Message-State: AOJu0YyH7lFqKlT+TYn797MKtn2QsEApifovLKKh5veliH2OyePHAWBn IQhQCL8jIfixM7Z1HPIXeqzKmQp4tj49TgqCJY3V3Ue5CuOXeqCI X-Gm-Gg: ASbGncs2XaGgKM1xM3lxyrlUcQ5LNjB/myTMC2zHPgFNIE1TNqoHEV8UrJmJ7DmGPVq mZPuVY9liGCWMABpGyD4D9Ze/18Ro3AUCn1WLON1COUDjAL4qfXHvN8xTpwr2LX2ZnELwA4xLpZ JOd/8RUP86c4TloV0U17HKEKiWKhejgifjSz8PFzWERXjddfYv9+8lP+15Ga8LMr3uX2Gvd4Tb6 8Q36JlFEXl3zoEu8rsBg89DWPTsqM90ZNwvsiV4WE1aYe9QManGDtrczES3FWmfLMCOrtbtv+7x paTrf6cX2qHznWP6o2OEb7YqGFXsByNqpVxJYxPAFEVM X-Google-Smtp-Source: AGHT+IH5xq74SLhEQQVKGQoN0+XaUZSN4rk7bMP+GXNdeqGdrawl3inEGgXXs8hNrPfSvdc0eFn4bQ== X-Received: by 2002:a05:6a00:8d8d:b0:736:31cf:2590 with SMTP id d2e1a72fcca58-74058aea47emr1781034b3a.16.1746156684536; Thu, 01 May 2025 20:31:24 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 05/22] tests/qtest/xhci: Add basic USB Mass Storage tests Date: Fri, 2 May 2025 13:30:29 +1000 Message-ID: <20250502033047.102465-6-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::434; envelope-from=npiggin@gmail.com; helo=mail-pf1-x434.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156720707124100 Content-Type: text/plain; charset="utf-8" Add a usb-storage device to xhci tests, enable USB Mass Storage Bulk endpoints, and run some MSD commands through it. Signed-off-by: Nicholas Piggin Reviewed-by: Fabiano Rosas --- tests/qtest/usb-hcd-xhci-test.c | 359 +++++++++++++++++++++++++++++++- 1 file changed, 351 insertions(+), 8 deletions(-) diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index 291d1dfc36e..39c5c36e940 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -373,6 +373,20 @@ static uint64_t submit_cr_trb(XHCIQState *s, const XHC= ITRB *trb) return ret; } =20 +static uint64_t submit_tr_trb(XHCIQState *s, int slot, int ep, + const XHCITRB *trb) +{ + XHCIQSlotState *sl =3D &s->slots[slot]; + XHCIQTRState *tr =3D &sl->transfer_ring[ep]; + uint64_t ret; + + ret =3D queue_trb(s, tr, trb); + + xhci_db_writel(s, slot, 1 + ep); /* doorbell slot, EP target */ + + return ret; +} + static void xhci_enable_device(XHCIQState *s) { XHCIQTRState *tr; @@ -451,14 +465,165 @@ static void xhci_enable_device(XHCIQState *s) for (i =3D 0; i < s->maxports; i++) { value =3D xhci_port_readl(s, i, 0); /* PORTSC */ =20 - /* All ports should be disabled */ - g_assert(!(value & XHCI_PORTSC_CCS)); - g_assert(!(value & XHCI_PORTSC_PED)); - g_assert(((value >> XHCI_PORTSC_PLS_SHIFT) & - XHCI_PORTSC_PLS_MASK) =3D=3D 5); + /* First port should be attached and enabled if we have usb-storag= e */ + if (qtest_has_device("usb-storage") && i =3D=3D 0) { + g_assert(value & XHCI_PORTSC_CCS); + g_assert(value & XHCI_PORTSC_PED); + /* Port Speed must be identified (non-zero) */ + g_assert(((value >> XHCI_PORTSC_SPEED_SHIFT) & + XHCI_PORTSC_SPEED_MASK) !=3D 0); + } else { + g_assert(!(value & XHCI_PORTSC_CCS)); + g_assert(!(value & XHCI_PORTSC_PED)); + g_assert(((value >> XHCI_PORTSC_PLS_SHIFT) & + XHCI_PORTSC_PLS_MASK) =3D=3D 5); + } } } =20 +/* XXX: what should these values be? */ +#define TRB_MAX_PACKET_SIZE 0x200 +#define TRB_AVERAGE_LENGTH 0x200 + +static void xhci_enable_slot(XHCIQState *s) +{ + XHCIQTRState *tr; + uint64_t input_context; + XHCITRB trb; + uint64_t tag; + g_autofree void *mem =3D g_malloc0(0x1000); /* buffer for writing to g= uest */ + uint32_t *dc; /* device context */ + + /* Issue a command ring enable slot */ + memset(&trb, 0, TRB_SIZE); + trb.control |=3D CR_ENABLE_SLOT << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_cr_trb(s, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter , =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_COMMAND_COMPLETE); + s->slotid =3D (trb.control >> TRB_CR_SLOTID_SHIFT) & 0xff; + + /* 32-byte input context size, should check HCCPARAMS1 for 64-byte siz= e */ + input_context =3D xhci_guest_zalloc(s, 0x420); + + /* Set input control context */ + memset(mem, 0, 0x420); + ((uint32_t *)mem)[1] =3D cpu_to_le32(0x3); /* Add device contexts 0 an= d 1 */ + + /* Slot context */ + dc =3D mem + 1 * 0x20; + dc[0] =3D cpu_to_le32(1 << 27); /* 1 context entry */ + dc[1] =3D cpu_to_le32(1 << 16); /* 1 port number */ + + /* Endpoint 0 context */ + tr =3D &s->slots[s->slotid].transfer_ring[0]; + tr->addr =3D xhci_guest_zalloc(s, 0x1000); + tr->trb_entries =3D 0x10; + tr->trb_c =3D 1; + + dc =3D mem + 2 * 0x20; + dc[0] =3D 0; + dc[1] =3D cpu_to_le32((ET_CONTROL << EP_TYPE_SHIFT) | + (TRB_MAX_PACKET_SIZE << 16)); + dc[2] =3D cpu_to_le32((tr->addr & 0xffffffff) | 1); /* DCS=3D1 */ + dc[3] =3D cpu_to_le32(tr->addr >> 32); + dc[4] =3D cpu_to_le32(TRB_AVERAGE_LENGTH); + qtest_memwrite(s->parent->qts, input_context, mem, 0x420); + + s->slots[s->slotid].device_context =3D xhci_guest_zalloc(s, 0x400); + + ((uint64_t *)mem)[0] =3D cpu_to_le64(s->slots[s->slotid].device_contex= t); + qtest_memwrite(s->parent->qts, s->dc_base_array + 8 * s->slotid, mem, = 8); + + /* Issue a command ring address device */ + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D input_context; + trb.control |=3D CR_ADDRESS_DEVICE << TRB_TYPE_SHIFT; + trb.control |=3D s->slotid << TRB_CR_SLOTID_SHIFT; + tag =3D submit_cr_trb(s, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter , =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_COMMAND_COMPLETE); + + guest_free(&s->parent->alloc, input_context); + + /* Check EP0 is running */ + qtest_memread(s->parent->qts, s->slots[s->slotid].device_context, mem,= 0x400); + g_assert((((uint32_t *)mem)[8] & 0x3) =3D=3D EP_RUNNING); +} + +static void xhci_enable_msd_bulk_endpoints(XHCIQState *s) +{ + XHCIQTRState *tr; + uint64_t input_context; + XHCITRB trb; + uint64_t tag; + g_autofree void *mem =3D g_malloc0(0x1000); /* buffer for writing to g= uest */ + uint32_t *dc; /* device context */ + + /* Configure 2 more endpoints */ + + /* 32-byte input context size, should check HCCPARAMS1 for 64-byte siz= e */ + input_context =3D xhci_guest_zalloc(s, 0x420); + + /* Set input control context */ + memset(mem, 0, 0x420); + ((uint32_t *)mem)[1] =3D cpu_to_le32(0x19); /* Add device contexts 0, = 3, 4 */ + + /* Slot context */ + dc =3D mem + 1 * 0x20; + dc[0] =3D cpu_to_le32(1 << 27); /* 1 context entry */ + dc[1] =3D cpu_to_le32(1 << 16); /* 1 port number */ + + /* Endpoint 1 (IN) context */ + tr =3D &s->slots[s->slotid].transfer_ring[2]; + tr->addr =3D xhci_guest_zalloc(s, 0x1000); + tr->trb_entries =3D 0x10; + tr->trb_c =3D 1; + + dc =3D mem + 4 * 0x20; + dc[0] =3D 0; + dc[1] =3D cpu_to_le32((ET_BULK_IN << EP_TYPE_SHIFT) | + (TRB_MAX_PACKET_SIZE << 16)); + dc[2] =3D cpu_to_le32((tr->addr & 0xffffffff) | 1); /* DCS=3D1 */ + dc[3] =3D cpu_to_le32(tr->addr >> 32); + dc[4] =3D cpu_to_le32(TRB_AVERAGE_LENGTH); + + /* Endpoint 2 (OUT) context */ + tr =3D &s->slots[s->slotid].transfer_ring[3]; + tr->addr =3D xhci_guest_zalloc(s, 0x1000); + tr->trb_entries =3D 0x10; + tr->trb_c =3D 1; + + dc =3D mem + 5 * 0x20; + dc[0] =3D 0; + dc[1] =3D cpu_to_le32((ET_BULK_OUT << EP_TYPE_SHIFT) | + (TRB_MAX_PACKET_SIZE << 16)); + dc[2] =3D cpu_to_le32((tr->addr & 0xffffffff) | 1); /* DCS=3D1 */ + dc[3] =3D cpu_to_le32(tr->addr >> 32); + dc[4] =3D cpu_to_le32(TRB_AVERAGE_LENGTH); + qtest_memwrite(s->parent->qts, input_context, mem, 0x420); + + /* Issue a command ring configure endpoint */ + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D input_context; + trb.control |=3D CR_CONFIGURE_ENDPOINT << TRB_TYPE_SHIFT; + trb.control |=3D s->slotid << TRB_CR_SLOTID_SHIFT; + tag =3D submit_cr_trb(s, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter , =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_COMMAND_COMPLETE); + + guest_free(&s->parent->alloc, input_context); + + /* Check EPs are running */ + qtest_memread(s->parent->qts, s->slots[s->slotid].device_context, mem,= 0x400); + g_assert((((uint32_t *)mem)[1*8] & 0x3) =3D=3D EP_RUNNING); + g_assert((((uint32_t *)mem)[3*8] & 0x3) =3D=3D EP_RUNNING); + g_assert((((uint32_t *)mem)[4*8] & 0x3) =3D=3D EP_RUNNING); +} + static void xhci_disable_device(XHCIQState *s) { int i; @@ -477,6 +642,144 @@ static void xhci_disable_device(XHCIQState *s) guest_free(&s->parent->alloc, s->dc_base_array); } =20 +struct QEMU_PACKED usb_msd_cbw { + uint32_t sig; + uint32_t tag; + uint32_t data_len; + uint8_t flags; + uint8_t lun; + uint8_t cmd_len; + uint8_t cmd[16]; +}; + +struct QEMU_PACKED usb_msd_csw { + uint32_t sig; + uint32_t tag; + uint32_t residue; + uint8_t status; +}; + +static ssize_t xhci_submit_scsi_cmd(XHCIQState *s, + const uint8_t *cmd, uint8_t cmd_len, + void *data, uint32_t data_len, + bool data_in) +{ + struct usb_msd_cbw cbw; + struct usb_msd_csw csw; + uint64_t trb_data; + XHCITRB trb; + uint64_t tag; + + /* TRB data payload */ + trb_data =3D xhci_guest_zalloc(s, data_len > sizeof(cbw) ? data_len : = sizeof(cbw)); + + memset(&cbw, 0, sizeof(cbw)); + cbw.sig =3D cpu_to_le32(0x43425355); + cbw.tag =3D cpu_to_le32(0); + cbw.data_len =3D cpu_to_le32(data_len); + cbw.flags =3D data_in ? 0x80 : 0x00; + cbw.lun =3D 0; + cbw.cmd_len =3D cmd_len; /* cmd len */ + memcpy(cbw.cmd, cmd, cmd_len); + qtest_memwrite(s->parent->qts, trb_data, &cbw, sizeof(cbw)); + + /* Issue a transfer ring ep 3 data (out) */ + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D trb_data; + trb.status =3D sizeof(cbw); + trb.control |=3D TR_NORMAL << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 3, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + + if (data_in) { + g_assert(data_len); + + /* Issue a transfer ring ep 2 data (in) */ + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D trb_data; + trb.status =3D data_len; /* data_len bytes, no more packets */ + trb.control |=3D TR_NORMAL << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 2, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + + qtest_memread(s->parent->qts, trb_data, data, data_len); + } else if (data_len) { + qtest_memwrite(s->parent->qts, trb_data, data, data_len); + + /* Issue a transfer ring ep 3 data (out) */ + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D trb_data; + trb.status =3D data_len; /* data_len bytes, no more packets */ + trb.control |=3D TR_NORMAL << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 3, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + } else { + /* No data */ + } + + /* Issue a transfer ring ep 2 data (in) */ + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D trb_data; + trb.status =3D sizeof(csw); + trb.control |=3D TR_NORMAL << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 2, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + + qtest_memread(s->parent->qts, trb_data, &csw, sizeof(csw)); + + guest_free(&s->parent->alloc, trb_data); + + g_assert(csw.sig =3D=3D cpu_to_le32(0x53425355)); + g_assert(csw.tag =3D=3D cpu_to_le32(0)); + if (csw.status) { + return -1; + } + return data_len - le32_to_cpu(csw.residue); /* bytes copied */ +} + +#include "scsi/constants.h" + +static void xhci_test_msd(XHCIQState *s) +{ + uint8_t scsi_cmd[16]; + g_autofree void *mem =3D g_malloc0(0x1000); /* buffer for writing to g= uest */ + + /* Clear SENSE data */ + memset(scsi_cmd, 0, sizeof(scsi_cmd)); + scsi_cmd[0] =3D INQUIRY; + if (xhci_submit_scsi_cmd(s, scsi_cmd, 6, mem, 0, false) < 0) { + g_assert_not_reached(); + } + + /* Report LUNs */ + memset(scsi_cmd, 0, sizeof(scsi_cmd)); + scsi_cmd[0] =3D REPORT_LUNS; + /* length in big-endian */ + scsi_cmd[6] =3D 0x00; + scsi_cmd[7] =3D 0x00; + scsi_cmd[8] =3D 0x01; + scsi_cmd[9] =3D 0x00; + + if (xhci_submit_scsi_cmd(s, scsi_cmd, 16, mem, 0x100, true) < 0) { + g_assert_not_reached(); + } + + /* Check REPORT_LUNS data found 1 LUN */ + g_assert(((uint32_t *)mem)[0] =3D=3D cpu_to_be32(8)); /* LUN List Leng= th */ +} + /* * This test brings up an endpoint and runs some noops through its command * ring and gets responses back on the event ring, then brings up a device @@ -490,9 +793,18 @@ static void test_xhci_stress_rings(const void *arg) uint64_t tag; int i; =20 - s =3D xhci_boot("-M q35 " - "-device %s,id=3Dxhci,bus=3Dpcie.0,addr=3D1d.0 ", - td->device); + if (qtest_has_device("usb-storage")) { + s =3D xhci_boot("-M q35 " + "-device %s,id=3Dxhci,bus=3Dpcie.0,addr=3D1d.0 " + "-device usb-storage,bus=3Dxhci.0,drive=3Ddrive0 " + "-drive id=3Ddrive0,if=3Dnone,file=3Dnull-co://," + "file.read-zeroes=3Don,format=3Draw ", + td->device); + } else { + s =3D xhci_boot("-M q35 " + "-device %s,id=3Dxhci,bus=3Dpcie.0,addr=3D1d.0 ", + td->device); + } g_assert_cmphex(s->fingerprint, =3D=3D, td->fingerprint); =20 xhci_enable_device(s); @@ -513,6 +825,34 @@ static void test_xhci_stress_rings(const void *arg) xhci_shutdown(s); } =20 +/* + * This test brings up a USB MSD endpoint and runs MSD (SCSI) commands. + */ +static void test_usb_msd(const void *arg) +{ + const TestData *td =3D arg; + XHCIQState *s; + + s =3D xhci_boot("-M q35 " + "-device %s,id=3Dxhci,bus=3Dpcie.0,addr=3D1d.0 " + "-device usb-storage,bus=3Dxhci.0,drive=3Ddrive0 " + "-drive id=3Ddrive0,if=3Dnone,file=3Dnull-co://," + "file.read-zeroes=3Don,format=3Draw ", + td->device); + g_assert_cmphex(s->fingerprint, =3D=3D, td->fingerprint); + + xhci_enable_device(s); + + xhci_enable_slot(s); + + xhci_enable_msd_bulk_endpoints(s); + + xhci_test_msd(s); + + xhci_disable_device(s); + xhci_shutdown(s); +} + static void add_test(const char *name, TestData *td, void (*fn)(const void= *)) { g_autofree char *full_name =3D g_strdup_printf( @@ -530,6 +870,9 @@ static void add_tests(TestData *td) add_test("usb-ccid", td, test_usb_ccid_hotplug); } add_test("xhci-stress-rings", td, test_xhci_stress_rings); + if (qtest_has_device("usb-storage")) { + add_test("usb-msd", td, test_usb_msd); + } } =20 /* tests */ --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156828; cv=none; d=zohomail.com; s=zohoarc; b=Mx6YlqvwVdi6E5hQt/5nVfLgkVq4IbwqvFXvphw2nrTpR3UyS5nw0BbHLPDq7BdTppHdGScB89EoFa9udBHNhVHG3N7JWH6+qBw77KROoipIWqRwL0aD1XJFQ8q8JHvvr8/KtzgfzJvlBzQ//R11lRrPO5Ob0vdCcMMBVn1KAI8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156828; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=1lmS65fZf1hovgzPaFQwZvs4bM/iLU2g3QpGdLfzqQg=; b=BT2DSD2iVg22ghm8sW11Z3DD7OiQ1fL/bt3kdgWwKtae7Q+Pi2pLEVWwTGDUnS0j3X2TVrBplh56SIY/vnvJEi9RpJmuUMAkm0Dc2GGhJ7He4hLveRuEfCVkM4NClr+z2Imb8rY0ajZ5V0ejJcQMTcenDLMiXSg2sR+ven2ht2Q= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156828183108.47555823229663; Thu, 1 May 2025 20:33:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7o-0004DJ-Lp; Thu, 01 May 2025 23:31:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7c-0004AQ-P5 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:32 -0400 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7b-0001GP-22 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:32 -0400 Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-736c1cf75e4so1530695b3a.2 for ; Thu, 01 May 2025 20:31:30 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156690; x=1746761490; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1lmS65fZf1hovgzPaFQwZvs4bM/iLU2g3QpGdLfzqQg=; b=frU3hhTnhO8zK6M92RKOhGxBtXIDgwb3AtPtob2nChiO/5JKGuYcHQX/nqUtLWuMbX NrCZQC64DfWBkHGA4+5GI/xjQOddVh8jWgK1OB4dpMqoleJ7aGwcM501I5jhSwEXJKIb EsOMZKHdAqbmxEsoPfSlCkMo76GwLDTZh5EmQQgy0ujasyPeL75TRW7fDcT9Ao32xLj5 dngVwLRdurFLJH7pNcfF201sS0hIqQP4PjouAqQXIiRTaJjw0XEByzW0sRkvcc4aNrc8 V3xeXMDJzicR+pagonX9tBK6vb2DIyT0mSlO+InT9LOOA1ZW/yQeVkIDZyKnMsAw2hss +CBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156690; x=1746761490; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1lmS65fZf1hovgzPaFQwZvs4bM/iLU2g3QpGdLfzqQg=; b=IkMW/aVZl3xlfhuTCG1JVW9G07a/5Nup31Su+f3llti/8bx/U4KFo1mL7j1LAAMdaD IWV0KzvPejPy+10iQxRRrhWsI/tjfvoGrhz/M5EMLbW03iLROkJtCpomJMapt2pv9RIi Upxc3QUgHarOZ+ukSAxw27CKD/JUT/6rc6D/zUygj1zMvRDn5chfh7EpfH+6oTRmEDRh wJNDxskJJD3S5Ic77veh8lMBSLZ/xA0KKTKU61oZk3u1IbkKyWNPihLPV6y4CWjyRKKE RxZlh5+OTkJNLEOKy0/ctt+Ph1H1WavyTlL7rqC3ft1Te1yXXMoEPH4oCMUanDgJ+wj0 1J+w== X-Forwarded-Encrypted: i=1; AJvYcCV0A5gBS0cl71RBk/0cykEs4aSjR8/NeqCxa82D/UPmWyTMbycfbrOJfo/pyLg6Cb/jIS5qfERdon/9@nongnu.org X-Gm-Message-State: AOJu0Ywb8BxnsQRBHOvYVNTH2NGM4p7tNaxiondtQT3nTzSvA7kVf2Zx 4A3i4HEEaMl07lUPKob4y4ZgKeeawygEEpSEPf3/8L/ROCE9eLlG X-Gm-Gg: ASbGncv97atwXS6KUqkxPz0lwlxTQC8rZlcM60pwQE1xCRGnMzeKOFIx3BuKDNzdRWb Nyzy3kYazU31TyoPhCuQBEwHmypV2T/zpmmSwwsrK6YrEsTL3MZVBbyYLSWUUP09VobtCQydSa9 woEP7FNP//9D0pz7kNcW+dMlv5glqJZt7oOXcSQcYowPLHRlCrz9mToj5EKdAYFw0iJF/nUa5YP bQ6myrSe5PT9UYsMwyhzCElqbRJXsTMPNd90Aeoodf84RxtCXJRtrqY/fVJs6tt6FnXvb1Zrttt 4WP7Y+ZxunswOtzRKk6laZTCYcXHBnPDmZK9Gajh2WPf X-Google-Smtp-Source: AGHT+IEu6VlXM40BhVUfDkOtcaxFsZzttNGo+ZBqotB3iXtqlqr4Prb78Mc+2b7k8vONhS8F2v99UQ== X-Received: by 2002:a05:6a21:b8a:b0:1d9:c615:d1e6 with SMTP id adf61e73a8af0-20cdc1ec1d6mr1999394637.0.1746156689651; Thu, 01 May 2025 20:31:29 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 06/22] hw/usb/xhci: Support TR NOOP commands Date: Fri, 2 May 2025 13:30:30 +1000 Message-ID: <20250502033047.102465-7-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42d; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42d.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156829427019100 Content-Type: text/plain; charset="utf-8" Implement XHCI TR NOOP commands by setting up then immediately completing the packet. The IBM AIX XHCI HCD driver uses NOOP commands to check driver and hardware health, which works after this change. Signed-off-by: Nicholas Piggin Reviewed-by: Peter Maydell --- hw/usb/hcd-xhci.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index ef9f2a7db41..6a490a5febf 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -1664,6 +1664,20 @@ static int xhci_fire_transfer(XHCIState *xhci, XHCIT= ransfer *xfer, XHCIEPContext return xhci_submit(xhci, xfer, epctx); } =20 +static int xhci_noop_transfer(XHCIState *xhci, XHCITransfer *xfer) +{ + /* + * TR NOOP conceptually probably better not call into USB subsystem + * (usb_packet_setup() via xhci_setup_packet()). In practice it + * works and avoids code duplication. + */ + if (xhci_setup_packet(xfer) < 0) { + return -1; + } + xhci_try_complete_packet(xfer); + return 0; +} + static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid, unsigned int streamid) { @@ -1786,6 +1800,8 @@ static void xhci_kick_epctx(XHCIEPContext *epctx, uns= igned int streamid) =20 epctx->kick_active++; while (1) { + bool noop =3D false; + length =3D xhci_ring_chain_length(xhci, ring); if (length <=3D 0) { if (epctx->type =3D=3D ET_ISO_OUT || epctx->type =3D=3D ET_ISO= _IN) { @@ -1814,10 +1830,20 @@ static void xhci_kick_epctx(XHCIEPContext *epctx, u= nsigned int streamid) epctx->kick_active--; return; } + if (type =3D=3D TR_NOOP) { + noop =3D true; + } } xfer->streamid =3D streamid; =20 - if (epctx->epid =3D=3D 1) { + if (noop) { + if (length !=3D 1) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: NOOP TR TRB within TRB chain!\n", __fun= c__); + /* Undefined behavior, we no-op the entire chain */ + } + xhci_noop_transfer(xhci, xfer); + } else if (epctx->epid =3D=3D 1) { xhci_fire_ctl_transfer(xhci, xfer); } else { xhci_fire_transfer(xhci, xfer, epctx); --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156726; cv=none; d=zohomail.com; s=zohoarc; b=iYVOFM2cxNeTxKxyYuujEHPdAilt9ESq4AY1M6+gshsmrxeZgqeDax9UyIt8p/oSI1jR8eHhne+3ShjVEILr6tSFXbDrelHVagCgTYypPapl0GwH2LXsns2H83pflolamTN5tTcwk1IL8S9rLlB0kr2BnmcHUHmVHYnOFjLoIDM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156726; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rXIXb2faI/v+5BbstE/05iPFk2Qe+qxfYczW0aTjP9Y=; b=i1Su7czXDa5avqDYVkj6Zy/my3RB2XONL4ixI6K72ghr+F86xpQ6ozsw+JysvS2pSXGTNGlBersK91D4QxavPv8Xq+OMzd2daiqUO7HV8eWuzpbwFoKJ3DRYftJ3MSytrPNqtEic1hZq8MeJmqFO7oP6TsEf4BDQCngXgbG/a3o= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156726419411.92365063102704; Thu, 1 May 2025 20:32:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7p-0004Hn-UR; Thu, 01 May 2025 23:31:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7i-0004Bm-58 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:38 -0400 Received: from mail-pg1-x52e.google.com ([2607:f8b0:4864:20::52e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7g-0001Gz-D0 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:37 -0400 Received: by mail-pg1-x52e.google.com with SMTP id 41be03b00d2f7-b170c99aa49so1048739a12.1 for ; Thu, 01 May 2025 20:31:36 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156695; x=1746761495; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rXIXb2faI/v+5BbstE/05iPFk2Qe+qxfYczW0aTjP9Y=; b=aUYea3c8I2dlaw39LJVDwNep4VuRVixYeAeN5FZPxgME7TCKIWQpRkQsgT1fw2UMtP 8eyZ8ThpNRsZd9t/NAgXDOexQA1lHYtkRxVmM6YunAYbQz0uSHwR8lT/CB06YKQpfaIW iPvIiAk1MdCvCBCAwbs058GYFw5HHyUKMIcKAUHlIB16xPCjecUa0TgLnY6UR7NKJI4A 18+WCMrWMKJEi00Ddj1hA5MdyINb+68LuIWahYpYLxb9e9oGFAxvJhx8mlzRGtztAbME dhanSqwiT4ut9oUOlyBEZjCtoUKRnNqelyznhUf9g1Bj/AuNXmCNoaH2QjNWjeH6D10j K5wQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156695; x=1746761495; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rXIXb2faI/v+5BbstE/05iPFk2Qe+qxfYczW0aTjP9Y=; b=w889a/ddBbsr/y+3/Ny+rDzeyy0r6x+F2E1swLi5zplQ4hhf7tmKDHQtdgcL/mcY+0 Ac9AgO7ZNYVN07zKU/laUS0nTMJK52Hq+JjA9++ue9RlIDs688duRq7Zpqw24Cv2nhst NfcS8VvtfsSw5v/IuiItLL+B4gOn/qrNKQbLnarVXrsNX73oXBU7NTw7XHxIS/Javs/E cVDxecxwrab2zOX9RAFMLAWdRzDoSaLdnbGiOYZpJnpqGPJ/ZcGENV3bopnNgDTW2/81 8iO825KMMYjQUMeXkxe9bVsr/EVaTZIq3YLipAb7/JraWnA/ik5pVnzvGPL8V3grjdmM F9Wg== X-Forwarded-Encrypted: i=1; AJvYcCXYcB7iht7D+gvt75Z0uZ+RYI8mVLPTlmg2uFBeAz8pDnsLWtiv0/uh3qYuMyOcanU2rOrYJ0597rtG@nongnu.org X-Gm-Message-State: AOJu0YyrJUTZwb1FO8j6sApWVOqNVG2UKbr/15rsvGS+49cU/mYWHOwl 6J5nHp539CH+SeOqosgk93OjB5WPgYERi0qzZKfTQ2EiUbhQGi6h4l5AQg== X-Gm-Gg: ASbGncsjZzZNAz2J3/apR/sKwnz76nOl8iAQk54n5OCGgjQd/faUqJK0wZ9OdGZro2C LqWbglVY6UyBLIzJsKom4yk6GUV+cQcDDAbgpgO+9ZFqbpBYq0ieY3rG3GKAxjzxrGkeoA7BFjs Hfg1yHCXqFAMu81P2sWvceyBjSuP3JMUStnqFpLiZ9EahlEmKM7Y5a6bURrCKn2YJauKkfKknDc 428QEHwMiB3ks0HG0TdsFo6FBS8G44BcvEC0aAG12RAubWqh0x0UDygICHkxjxeRqf+xMNomIbO Mg7NuD52R9UPW5EM53rP1De2PmXp1p5BQHGQOSkVdCm2 X-Google-Smtp-Source: AGHT+IFMvZiat9mUCjLF9UHdmV1Sn32nq0nesXM7wpVe+pH6U9hM/8LS/AZv6WtZTpqJyqkQ5PXafA== X-Received: by 2002:a05:6a20:9e4a:b0:1fd:e9c8:cf3b with SMTP id adf61e73a8af0-20cdfcfc857mr2128966637.30.1746156694811; Thu, 01 May 2025 20:31:34 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 07/22] tests/qtest/xhci: add a test for TR NOOP commands Date: Fri, 2 May 2025 13:30:31 +1000 Message-ID: <20250502033047.102465-8-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::52e; envelope-from=npiggin@gmail.com; helo=mail-pg1-x52e.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156727392019100 Content-Type: text/plain; charset="utf-8" Run some TR NOOP commands through the transfer ring. Signed-off-by: Nicholas Piggin Reviewed-by: Fabiano Rosas --- tests/qtest/usb-hcd-xhci-test.c | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index 39c5c36e940..7f801f8f1a0 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -753,9 +753,29 @@ static ssize_t xhci_submit_scsi_cmd(XHCIQState *s, =20 static void xhci_test_msd(XHCIQState *s) { + XHCITRB trb; + uint64_t tag; uint8_t scsi_cmd[16]; g_autofree void *mem =3D g_malloc0(0x1000); /* buffer for writing to g= uest */ =20 + /* Issue a transfer ring ep 2 noop */ + memset(&trb, 0, TRB_SIZE); + trb.control |=3D TR_NOOP << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 2, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + + /* Issue a transfer ring ep 3 noop */ + memset(&trb, 0, TRB_SIZE); + trb.control |=3D TR_NOOP << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 3, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + /* Clear SENSE data */ memset(scsi_cmd, 0, sizeof(scsi_cmd)); scsi_cmd[0] =3D INQUIRY; @@ -821,6 +841,22 @@ static void test_xhci_stress_rings(const void *arg) g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_COMMAND_COMPLETE); } =20 + if (qtest_has_device("usb-storage")) { + xhci_enable_slot(s); + + /* Wrap the transfer ring a few times */ + for (i =3D 0; i < 100; i++) { + /* Issue a transfer ring ep 0 noop */ + memset(&trb, 0, TRB_SIZE); + trb.control |=3D TR_NOOP << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 0, &trb); + wait_event_trb(s, &trb); + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + } + } + xhci_disable_device(s); xhci_shutdown(s); } --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156740; cv=none; d=zohomail.com; s=zohoarc; b=lvYOj0CGBJwaXsIVoAoZ6CV5cZCWY9sYf1Pz4xlkjphQHtwZl9cvZCpzvWlzslzUnogYfFty16xh92INjfGCoEzvoEnLWkQbgLfpYubtCFVUCha+VRIJULwowekr1npQXFVkPic9vOUoMAZVncpHgteGA++WSIv+EoT6m0OD2NY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156740; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=FVk6lML4TjYWh+nQHo5STeX9xY8bJ23/rh4J7vefY5w=; b=Vy+HUnpyewqoQmQ087HxBvIlPes7Unji7Z5qECOiMo/KAZnrpe3p+UwAYLvfmP4JXsGYuPD6nW96i+DJ309xL6O44cvL1Q+t78GGG++EqbP4XOZ/+AkD/UuWAQGHktK/ztw1k6AqG7g3R866919jpF6mAXhtpvmAjDJJ14ZY7U0= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156740074720.8764388578022; Thu, 1 May 2025 20:32:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7s-0004O0-N6; Thu, 01 May 2025 23:31:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7n-0004Cy-5y for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:43 -0400 Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7l-0001Hs-Ey for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:42 -0400 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-736c3e7b390so1889997b3a.2 for ; Thu, 01 May 2025 20:31:40 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156700; x=1746761500; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FVk6lML4TjYWh+nQHo5STeX9xY8bJ23/rh4J7vefY5w=; b=YeuP4jFTO8+yZrDmuBuZR1z8/G4GmpBlVqkKwUONsagYeE6NOXr9xoyEv6tcxZZ0RV 42ZLeCFO3jVs/p36+2frNUedtW/UWNo2/RiIAuZ8OH30gIiY5wooVvmmdZa56oCxThkw aSnR+4S5/xLBgX2l0auKgivGqYJx8mDDw/OfagNzyAVkliJPY/HPGZ8Cw+l/cPAUIzvd M8iBV4LJywzMWTjdN07NqsOV7EcbLlDbL/QIiEYzjTJRHOM1dDHesi7iXdg9+YctTqb4 VDyvZA012YPmZVThXWMBcbgESTDxEyztRtYsykBB3SInXyLLcA7fxC0UojNY64xxXCKR y77A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156700; x=1746761500; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FVk6lML4TjYWh+nQHo5STeX9xY8bJ23/rh4J7vefY5w=; b=HsnVc7ovHUy0JorvcpvQbVFp5acKiQQOXj/utugqse9M9fT9mhZfebnVIx39K6YqdD rAGtV2nLAIedg+asuKNAxR0Btn/yYUCXqHVAqDDt17zJGL6ho5RK6+2N65OPEUbgsdrP AYyZ1cd62Jh6PAMAO82DaX08rnfxAK28685dsTdYeLT2EhHfmna/sGMXssr/IJyj0tnu 0PON9bi78zPIHkTRP2E5u7Vg2FkkRDCm5c20v57n6LCnh65ttXNoLQJNLpDAn2Jdpg1g Ge2HApZmTaAbCXRv0VsDZbbBWDCvfFVKV3k8i/+x+yQX0dPvib1RHAlKPTDOXwTqoLNr r0rw== X-Forwarded-Encrypted: i=1; AJvYcCWnEoZ7HjphRIUiiCj0Hekwd6zRdemr2wnWBPedl734K3C/F8ir6Dq44vmhUJznHvwwNWRV2yRql/fG@nongnu.org X-Gm-Message-State: AOJu0Yxl4cY0mV7qFFe03hxq8d1USiTgIJSbxxpPeDrQ1kaK7clRePB2 QUBuMT6EbBIqdzpbIOGtDnHDlkOyTo9XTYRwYnFKK/S3QduM5WG7Uu0+9Q== X-Gm-Gg: ASbGncvIchMx1lftGcgW1CY/Hu7lwwdWY5tEM5+Jrpvdv4f/TBEuGr1ns2cErU+6Yl1 Gvdt/WGr14VHzrACOhE4UfC/Kv8tYk8KcgbicsKkZ8Do9+SE4m0EPOC5QD536bryJYhggR70qdG B8rVWPpKfg/3ZRicZBH61KfVk9aECWLKb7UybtWDdU0mxywyS1UduFlJN5pnU94hXSYljSICO5W gnIFPFApIrINyzYUbT8LdP5ogj3jiW5+L7rf5Kc0sQ0ByIU1ER0WeXihqrkZBYURb1ynmeuqn6Z 7p7VB478hioXHDP3tqJtqHO3lbAr5fZZXy7SQ8EcWHvR X-Google-Smtp-Source: AGHT+IHmkld8D+py6gnmKdOe8zpsSxUl8v4sfSXMbFeBb5+OGdlFT8qR9UTXUdsALUZUottTZYiNvA== X-Received: by 2002:a05:6a00:2985:b0:739:4a30:b902 with SMTP id d2e1a72fcca58-740588fa8acmr1844283b3a.2.1746156700004; Thu, 01 May 2025 20:31:40 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 08/22] tests/qtest/usb-hcd-xhci: Deliver msix interrupts Date: Fri, 2 May 2025 13:30:32 +1000 Message-ID: <20250502033047.102465-9-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42c; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42c.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156741390019100 Content-Type: text/plain; charset="utf-8" msix --- tests/qtest/usb-hcd-xhci-test.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index 7f801f8f1a0..2eecc8d9f26 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -48,6 +48,8 @@ typedef struct XHCIQState { QPCIBar bar; uint64_t barsize; uint32_t fingerprint; + uint64_t guest_msix_addr; + uint32_t msix_data; =20 /* In-memory arrays */ uint64_t dc_base_array; @@ -279,7 +281,8 @@ static void xhci_db_writel(XHCIQState *s, uint32_t db, = uint32_t value) =20 static bool xhci_test_isr(XHCIQState *s) { - return xhci_op_readl(s, XHCI_OPER_REG_USBSTS) & XHCI_USBSTS_EINT; + return qpci_msix_test_interrupt(s->dev, 0, + s->guest_msix_addr, s->msix_data); } =20 static void wait_event_trb(XHCIQState *s, XHCITRB *trb) @@ -298,6 +301,9 @@ static void wait_event_trb(XHCIQState *s, XHCITRB *trb) qtest_clock_step(s->parent->qts, 10000); } =20 + value =3D xhci_op_readl(s, XHCI_OPER_REG_USBSTS); + g_assert(value & XHCI_USBSTS_EINT); + /* With MSI-X enabled, IMAN IP is cleared after raising the interrupt = */ value =3D xhci_intr_readl(s, 0, XHCI_INTR_REG_IMAN); g_assert(!(value & XHCI_IMAN_IP)); @@ -395,7 +401,12 @@ static void xhci_enable_device(XHCIQState *s) uint32_t value; int i; =20 + s->guest_msix_addr =3D xhci_guest_zalloc(s, 4); + s->msix_data =3D 0x1234abcd; + qpci_msix_enable(s->dev); + qpci_msix_set_entry(s->dev, 0, s->guest_msix_addr, s->msix_data); + qpci_msix_set_masked(s->dev, 0, false); =20 hcsparams1 =3D xhci_cap_readl(s, XHCI_HCCAP_REG_HCSPARAMS1); s->maxports =3D (hcsparams1 >> 24) & 0xff; @@ -640,6 +651,7 @@ static void xhci_disable_device(XHCIQState *s) guest_free(&s->parent->alloc, s->command_ring.addr); guest_free(&s->parent->alloc, s->event_ring_seg); guest_free(&s->parent->alloc, s->dc_base_array); + guest_free(&s->parent->alloc, s->guest_msix_addr); } =20 struct QEMU_PACKED usb_msd_cbw { --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156801; cv=none; d=zohomail.com; s=zohoarc; b=EOj6eOYk4eYSCwBVmA/dnixn37ZTNusQv1dNTYa4fUUPXeH6KCRKUqKjskcfw56nv43mueUOovFK5LbCJFpo5oYy11KnNVvPr6sqOftK6dO/u3oi9BYC80FZCqdWvn0iR08tbafRKnaBJ0iE6kV2fRRBT2qDsXq6+LMNgUeHCXg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156801; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=UeR84shn1uCIwX+MVAuYfPQUwyqvqMWtDUSdpiM/Vf0=; b=E5qxBV64aYA3WBt8bsq8NULTr8il7WpyW16SK3SETutK7wuuOFcex19L/Ug0hhdu7NiZIr6FwdDO5fwY0RTJhiOyy4ayo7URX7hG9FyGSN5a+wmB+Cz+1cztCAAO2qXNd9PSoEcBliFiOUCQJa24BbIGDiWCjwlZmgRLL4YZIB8= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156801973598.5713688020362; Thu, 1 May 2025 20:33:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh7w-0004TT-Ry; Thu, 01 May 2025 23:31:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7s-0004Ob-Q9 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:49 -0400 Received: from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7q-0001IC-SG for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:48 -0400 Received: by mail-pf1-x42a.google.com with SMTP id d2e1a72fcca58-7403f3ece96so2263225b3a.0 for ; Thu, 01 May 2025 20:31:46 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156705; x=1746761505; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UeR84shn1uCIwX+MVAuYfPQUwyqvqMWtDUSdpiM/Vf0=; b=Yx8ZgMq34MkA1SM/rlXpxDwRX7zQzHEmC09AGqbagWb2rkf+Nzv2B7/W6OKoZxsRCS /whsiRmhgd15xEkFYPeH/huLwg3e/Sf65y7qkws/91NDgqfSSzJUStJzlNVkkAgrHr/5 s6yK6mAY2x6E2tiRaAwqcy5kiGTiwDKv8XFPyVibjWnqfh2D7vZjr75sSnDnU2185VSn Ek/EqTUIOAssh0G9Zwo6oJYYMnVlkG7XdKK3G3pJ9w7eDuDVNVJOn+G2lTyFs49pGFof qUJdWJbQjaDV7C4voYpFhQbIz66qaHdKm6oBKxNYdwXfYX/n7j4oPuZrsl5WYd/vUw0B alxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156705; x=1746761505; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UeR84shn1uCIwX+MVAuYfPQUwyqvqMWtDUSdpiM/Vf0=; b=mkYFarbdI+oBgZMqcgYC7swtHbSKg1lhkIM6QGNqAtD4H5M/1l/emSc5sZIqd31UdV fcdejD6HBbUyhT9t8/lc0ZRq7HBI82whsPH4y/CK3aDCemIKIYb3uVMnJkdgfnWJUjPj rlhsO3V8fFZ3zpRqecGKo+zK4ofz4FH91ApusoZgqzy6eNfKJvpZR/DauX001CSLb0Mq zb32xXhjxcAkiUPH+86BXp0civAxs24+72thf3lGbgXkgocN0JGky7bYq5LLumsh4EEV i5khf9cVN6oX+hNhRXWHI2kQabuOjEXqDB2s7mglPvPRu1gSxn0/aTLVW2JHZakrlExf wB2g== X-Forwarded-Encrypted: i=1; AJvYcCWGntsEWOLuLJGCDnXbVOqskySQYh8XCUCCFikd4uvN0h2XLmB9ZiyBHR7LW7dO7fxRswGpYQun/0jK@nongnu.org X-Gm-Message-State: AOJu0YwQyYw4CAkdGiYXQKvcjUmCNK6PbwOocIwREt1W0HWgk/AaemVY UzlLF+mcMhXcrbQUnNoLY0hXtDte7pMSibLtjbXc5HvpitKNTuio X-Gm-Gg: ASbGncvSEpF9g49vOYTN11enF81VXcq3Hb2k6IOaXMWJbYAThWrCq89VpG03UfR9QtX XR6GRLdi76UciAdaBY8DXMJjmYc+ZL10QQDWPB0wDEaVkTk3w7IZVz3r1IQtTrL67TdeHRg/clx JguTlzgImv6MSiMHHXO9de7Hi0OwBx14S66HM/u1YGSJXI/+diEYXKQGdtX5SZYbNVnB4JPHR4l iQ5un5KUW7ymX/SSkC1VpO+DvQIIklkD4xnXpMcG9W5ShvrX+rGmhGL50FqZbXw7iXqFu25rYax YDxNeSnnghITYjqJqRLOHKVfCWB2ZMKZxgTczyK9JK7X X-Google-Smtp-Source: AGHT+IFsoaqa8a+O0tlV+R8CFEkKBC9rnE5eKSdU7jYSs9xg/eDrN8FqkdfzrN+TWgg0WDGCC8f+hg== X-Received: by 2002:a05:6a00:2992:b0:736:3d7c:236c with SMTP id d2e1a72fcca58-74058a55711mr1749434b3a.14.1746156705382; Thu, 01 May 2025 20:31:45 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 09/22] hw/usb/hcd-xhci-pci: Make PCI device more configurable Date: Fri, 2 May 2025 13:30:33 +1000 Message-ID: <20250502033047.102465-10-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42a; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42a.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156803515019100 Content-Type: text/plain; charset="utf-8" To prepare to support another USB PCI Host Controller, make some PCI configuration dynamic. Signed-off-by: Nicholas Piggin --- hw/usb/hcd-xhci-pci.h | 9 ++++ hw/usb/hcd-xhci-pci.c | 118 +++++++++++++++++++++++++++++++++--------- 2 files changed, 103 insertions(+), 24 deletions(-) diff --git a/hw/usb/hcd-xhci-pci.h b/hw/usb/hcd-xhci-pci.h index 5b61ae84555..09aabae6e01 100644 --- a/hw/usb/hcd-xhci-pci.h +++ b/hw/usb/hcd-xhci-pci.h @@ -41,6 +41,15 @@ typedef struct XHCIPciState { OnOffAuto msi; OnOffAuto msix; bool conditional_intr_mapping; + uint8_t cache_line_size; + uint8_t pm_cap_off; + uint8_t pcie_cap_off; + uint8_t msi_cap_off; + uint8_t msix_cap_off; + int msix_bar_nr; + uint64_t msix_bar_size; + uint32_t msix_table_off; + uint32_t msix_pba_off; } XHCIPciState; =20 #endif diff --git a/hw/usb/hcd-xhci-pci.c b/hw/usb/hcd-xhci-pci.c index b93c80b09d8..911daf7e51f 100644 --- a/hw/usb/hcd-xhci-pci.c +++ b/hw/usb/hcd-xhci-pci.c @@ -32,9 +32,6 @@ #include "trace.h" #include "qapi/error.h" =20 -#define OFF_MSIX_TABLE 0x3000 -#define OFF_MSIX_PBA 0x3800 - static void xhci_pci_intr_update(XHCIState *xhci, int n, bool enable) { XHCIPciState *s =3D container_of(xhci, XHCIPciState, xhci); @@ -120,6 +117,31 @@ static int xhci_pci_vmstate_post_load(void *opaque, in= t version_id) return 0; } =20 +static int xhci_pci_add_pm_capability(PCIDevice *pci_dev, uint8_t offset, + Error **errp) +{ + int err; + + err =3D pci_add_capability(pci_dev, PCI_CAP_ID_PM, offset, + PCI_PM_SIZEOF, errp); + if (err < 0) { + return err; + } + + pci_set_word(pci_dev->config + offset + PCI_PM_PMC, + PCI_PM_CAP_VER_1_2 | + PCI_PM_CAP_D1 | PCI_PM_CAP_D2 | + PCI_PM_CAP_PME_D0 | PCI_PM_CAP_PME_D1 | + PCI_PM_CAP_PME_D2 | PCI_PM_CAP_PME_D3hot); + pci_set_word(pci_dev->wmask + offset + PCI_PM_PMC, 0); + pci_set_word(pci_dev->config + offset + PCI_PM_CTRL, + PCI_PM_CTRL_NO_SOFT_RESET); + pci_set_word(pci_dev->wmask + offset + PCI_PM_CTRL, + PCI_PM_CTRL_STATE_MASK); + + return 0; +} + static void usb_xhci_pci_realize(struct PCIDevice *dev, Error **errp) { int ret; @@ -128,7 +150,7 @@ static void usb_xhci_pci_realize(struct PCIDevice *dev,= Error **errp) =20 dev->config[PCI_CLASS_PROG] =3D 0x30; /* xHCI */ dev->config[PCI_INTERRUPT_PIN] =3D 0x01; /* interrupt pin 1 */ - dev->config[PCI_CACHE_LINE_SIZE] =3D 0x10; + dev->config[PCI_CACHE_LINE_SIZE] =3D s->cache_line_size; dev->config[0x60] =3D 0x30; /* release number */ =20 object_property_set_link(OBJECT(&s->xhci), "host", OBJECT(s), NULL); @@ -144,40 +166,78 @@ static void usb_xhci_pci_realize(struct PCIDevice *de= v, Error **errp) s->xhci.nec_quirks =3D true; } =20 - if (s->msi !=3D ON_OFF_AUTO_OFF) { - ret =3D msi_init(dev, 0x70, s->xhci.numintrs, true, false, &err); - /* - * Any error other than -ENOTSUP(board's MSI support is broken) - * is a programming error - */ - assert(!ret || ret =3D=3D -ENOTSUP); - if (ret && s->msi =3D=3D ON_OFF_AUTO_ON) { - /* Can't satisfy user's explicit msi=3Don request, fail */ - error_append_hint(&err, "You have to use msi=3Dauto (default) = or " - "msi=3Doff with this machine type.\n"); + if (s->pm_cap_off) { + if (xhci_pci_add_pm_capability(dev, s->pm_cap_off, &err)) { error_propagate(errp, err); return; } - assert(!err || s->msi =3D=3D ON_OFF_AUTO_AUTO); - /* With msi=3Dauto, we fall back to MSI off silently */ - error_free(err); } + + if (s->msi !=3D ON_OFF_AUTO_OFF) { + ret =3D msi_init(dev, s->msi_cap_off, s->xhci.numintrs, + true, false, &err); + if (ret) { + if (ret !=3D -ENOTSUP) { + /* Programming error */ + error_propagate(errp, err); + return; + } + if (s->msi =3D=3D ON_OFF_AUTO_ON) { + /* Can't satisfy user's explicit msi=3Don request, fail */ + error_append_hint(&err, "You have to use msi=3Dauto (defau= lt) " + "or msi=3Doff with this machine type.\n"= ); + error_propagate(errp, err); + return; + } + error_free(err); + err =3D NULL; /* With msi=3Dauto, we fall back to MSI off sile= ntly */ + } + } + pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64, &s->xhci.mem); =20 if (pci_bus_is_express(pci_get_bus(dev))) { - ret =3D pcie_endpoint_cap_init(dev, 0xa0); + ret =3D pcie_endpoint_cap_init(dev, s->pcie_cap_off); assert(ret > 0); } =20 if (s->msix !=3D ON_OFF_AUTO_OFF) { - /* TODO check for errors, and should fail when msix=3Don */ - msix_init(dev, s->xhci.numintrs, - &s->xhci.mem, 0, OFF_MSIX_TABLE, - &s->xhci.mem, 0, OFF_MSIX_PBA, - 0x90, NULL); + MemoryRegion *msix_bar =3D &s->xhci.mem; + + if (s->msix_bar_nr !=3D 0) { + memory_region_init(&dev->msix_exclusive_bar, OBJECT(dev), + "xhci-msix", s->msix_bar_size); + msix_bar =3D &dev->msix_exclusive_bar; + pci_register_bar(dev, s->msix_bar_nr, + PCI_BASE_ADDRESS_SPACE_MEMORY | + PCI_BASE_ADDRESS_MEM_TYPE_64, + msix_bar); + } + + ret =3D msix_init(dev, s->xhci.numintrs, + msix_bar, s->msix_bar_nr, s->msix_table_off, + msix_bar, s->msix_bar_nr, s->msix_pba_off, + s->msix_cap_off, &err); + if (ret) { + if (ret !=3D -ENOTSUP) { + /* Programming error */ + error_propagate(errp, err); + return; + } + if (s->msix =3D=3D ON_OFF_AUTO_ON) { + /* Can't satisfy user's explicit msix=3Don request, fail */ + error_append_hint(&err, "You have to use msix=3Dauto (defa= ult) " + "or msix=3Doff with this machine type.\n= "); + error_propagate(errp, err); + return; + } + error_free(err); + err =3D NULL; /* With msix=3Dauto, we fall back to MSI-X off s= ilently */ + /* Should we unregister BAR and memory region here? */ + } } s->xhci.as =3D pci_get_address_space(dev); } @@ -214,6 +274,16 @@ static void xhci_instance_init(Object *obj) PCI_DEVICE(obj)->cap_present |=3D QEMU_PCI_CAP_EXPRESS; object_initialize_child(obj, "xhci-core", &s->xhci, TYPE_XHCI); qdev_alias_all_properties(DEVICE(&s->xhci), obj); + + s->cache_line_size =3D 0x10; + s->pm_cap_off =3D 0; + s->pcie_cap_off =3D 0xa0; + s->msi_cap_off =3D 0x70; + s->msix_cap_off =3D 0x90; + s->msix_bar_nr =3D 0; + s->msix_bar_size =3D 0; + s->msix_table_off =3D 0x3000; + s->msix_pba_off =3D 0x3800; } =20 static const Property xhci_pci_properties[] =3D { --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156751; cv=none; d=zohomail.com; s=zohoarc; b=nUTZn2mBUorARJ/VlCGD4qxXYcCPLw2ogpdViEGh0agOjREAofvM4uDC8YxdWMKSQegjq3n1CPs+xq3qgI9kX5ASH+PoXKVjqEXrzq1zaHbMYWL4e3CjxQ4iimY980XVI/TDHPkrRiWhQev4s9YD+IBIPg+pOyvpEAyUmDRx/E0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156751; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=+bwaHMNOhN5/3SiuCmSg59LLWnyBqFKfT3s/956qIKI=; b=IcXBFQALggdpp659bqp3cTharskoLVh2rCTbzhQ2MbFanewC1Td/WvRttwD1M9fJVRt1OmDPpm16P2WTquuaBq7wbxgcQav4/Rcy6lDwtuoDSW1HSx+B6yG5vtSEeygjgUlQB8HUKAMHkOefhbekWdqkNTXlBud1/WFttZLBhBQ= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156751087440.5401843654631; Thu, 1 May 2025 20:32:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh80-0004Zb-9k; Thu, 01 May 2025 23:31:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh7y-0004WX-F2 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:54 -0400 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh7v-0001IU-R2 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:54 -0400 Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-73bf1cef6ceso1737948b3a.0 for ; Thu, 01 May 2025 20:31:51 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156710; x=1746761510; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+bwaHMNOhN5/3SiuCmSg59LLWnyBqFKfT3s/956qIKI=; b=naXZOCuKMbln2EwyNdzPTxi2OdpR/f+ULwHYmGxNuUwvsFTOKHk892hkvOM4QmV98c F8ZDWd1R+YKu4uh10ImIQxs2snRfy90yXtbf30wIHL8/jXOGaKCUFdSRJZz5VsULZglG /iI7Tgf6ee9vf3wdDzeDapyhJDFS7EfC1JSSTmBrLDMQ2/IWywyXn0qudzHJ9USJ7eWy MiBPfDOnceOT8ySApCuk4bs1V9fPYIK2gErV3UKfB2EwkNPHc8kT2uZ90CaYHtbzLJUq g8Tv0fSuGG7a6G1LzbemWz5EwriGyuCgDnH9gz5iFRHj2RabdCdCTMyN3KYuqkaKVvWl 11bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156710; x=1746761510; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+bwaHMNOhN5/3SiuCmSg59LLWnyBqFKfT3s/956qIKI=; b=T9Rky0G68Ru2wvG18O3oL5PIMw8V4T4OF9bUUewHqvI9dwI7O5rY9wTJEmnId+3Evq puxHWSmwD8oJXCgd7q4/fo4HvHdguT6kuYMaHP1rpce37Iingsh/pncUnc7KdZa+ZBay 7hIuDtRB6ZHFXcrFwy3ABGI/07MrtrOODaSaYtLJn4BDO5NyswA71edqfuaUxcSM6LZR jtP5SchTblxCrmuKGJid5UEjdlQI3CE+mE9LbrjdJahU2QNX7gWW7b0GqO+ZD5QVKQp0 H0DkGsgfyTPQBPBZxWWw6tI3xklfhPJKz+fWKJHZjFe3QOIb6PI74x5zOojEQfdkwvA1 m5tA== X-Forwarded-Encrypted: i=1; AJvYcCW+YlQmgxVxsafdm9lGcTZtEjGG42c/SL/wIycbwPPVUSrV1h/KgtSYSAbBeq7jwRZ/E/8aGcobV1Fv@nongnu.org X-Gm-Message-State: AOJu0YzSFxG8sSpOoYDJW5gknIl6B8926zfb3AXPLleuOo9YYkI36Uec nfiDIn7ksmsqk4Hb++wwBmEVliy1nYtJU/FoGvy6hQovMXIo4m1ghaxJZg== X-Gm-Gg: ASbGncvfZ6RBtHuoJR5Xg38AvJAXTWAlcTgQdGfPqmssAXOD8O4GF4Ya52LEBkFQqSG HX9nUgesxcH5lyho9L8/StaMVPzyP6z3IUWZEqKv1anuKb94tjQcNV1/OgUIy2t1R8/u7Q9NS6H rUT8zIu09E/IiU+wNgmSbmkVwVBip9OMWFBH4Cc0WvIff5ImP8m9N3HuOKDXCZOofZrqlbqDPbS uOFgiSW4z8KhaWHbW3EzAa6yTj5T+caybXrtCKqyU/RpQX/RvT26MBWFzxFNUCgo+XwMRtkl6m7 tMkg0WkgMAKay+vlFrlMWmcE2MYV14CqF+6yNghzrtvS X-Google-Smtp-Source: AGHT+IHjrZ7ck+RMRIwwbbdv/PdV8MsbmCit/9MQ2zf4wf4kR5zJEBrh7MGlKCFk/VCr2QlY08E2Kw== X-Received: by 2002:a05:6a00:428f:b0:736:6ac4:d204 with SMTP id d2e1a72fcca58-74058a4e54amr1659312b3a.11.1746156710501; Thu, 01 May 2025 20:31:50 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 10/22] hw/usb/hcd-xhci-pci: Add TI TUSB73X0 XHCI controller model Date: Fri, 2 May 2025 13:30:34 +1000 Message-ID: <20250502033047.102465-11-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::434; envelope-from=npiggin@gmail.com; helo=mail-pf1-x434.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156753302019100 Content-Type: text/plain; charset="utf-8" The TI TUSB73X0 controller has some interesting differences from NEC, notably a separate BAR for MSIX, and PM capabilities. The spec is freely available without sign-up. This controller is accepted by IBM Power proprietary firmware and software (when the subsystem IDs are set to Power servers, which is not done here). IBM code is picky about device support, so the NEC device can not be used. xhci qtests are enabled for this device. Signed-off-by: Nicholas Piggin Reviewed-by: Peter Maydell --- include/hw/pci/pci_ids.h | 1 + include/hw/usb/xhci.h | 1 + hw/usb/hcd-xhci-ti.c | 77 +++++++++++++++++++++++++++++++++ tests/qtest/usb-hcd-xhci-test.c | 3 ++ hw/usb/Kconfig | 5 +++ hw/usb/meson.build | 1 + 6 files changed, 88 insertions(+) create mode 100644 hw/usb/hcd-xhci-ti.c diff --git a/include/hw/pci/pci_ids.h b/include/hw/pci/pci_ids.h index 33e2898be95..99fe751703f 100644 --- a/include/hw/pci/pci_ids.h +++ b/include/hw/pci/pci_ids.h @@ -182,6 +182,7 @@ #define PCI_VENDOR_ID_HP 0x103c =20 #define PCI_VENDOR_ID_TI 0x104c +#define PCI_DEVICE_ID_TI_TUSB73X0 0x8241 =20 #define PCI_VENDOR_ID_MOTOROLA 0x1057 #define PCI_DEVICE_ID_MOTOROLA_MPC106 0x0002 diff --git a/include/hw/usb/xhci.h b/include/hw/usb/xhci.h index 5c90e1373e5..203ec1fca32 100644 --- a/include/hw/usb/xhci.h +++ b/include/hw/usb/xhci.h @@ -3,6 +3,7 @@ =20 #define TYPE_XHCI "base-xhci" #define TYPE_NEC_XHCI "nec-usb-xhci" +#define TYPE_TI_XHCI "ti-usb-xhci" #define TYPE_QEMU_XHCI "qemu-xhci" #define TYPE_XHCI_SYSBUS "sysbus-xhci" =20 diff --git a/hw/usb/hcd-xhci-ti.c b/hw/usb/hcd-xhci-ti.c new file mode 100644 index 00000000000..b7bb71c62e8 --- /dev/null +++ b/hw/usb/hcd-xhci-ti.c @@ -0,0 +1,77 @@ +/* + * USB xHCI TI TUSB73X0 controller emulation + * Datasheet https://www.ti.com/product/TUSB7340 + * + * Copyright (c) 2025 IBM Corporation + * Derived from hcd-xhci-nec.c, copyright accordingly. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "qemu/osdep.h" +#include "hw/usb.h" +#include "qemu/module.h" +#include "hw/pci/pci.h" +#include "hw/qdev-properties.h" + +#include "hcd-xhci-pci.h" + +OBJECT_DECLARE_SIMPLE_TYPE(XHCITiState, TI_XHCI) + +struct XHCITiState { + XHCIPciState parent_obj; + + uint32_t intrs; + uint32_t slots; +}; + +static const Property ti_xhci_properties[] =3D { + DEFINE_PROP_UINT32("intrs", XHCITiState, intrs, 8), + DEFINE_PROP_UINT32("slots", XHCITiState, slots, XHCI_MAXSLOTS), +}; + +static void ti_xhci_instance_init(Object *obj) +{ + XHCIPciState *pci =3D XHCI_PCI(obj); + XHCITiState *ti =3D TI_XHCI(obj); + + pci->xhci.numintrs =3D ti->intrs; + pci->xhci.numslots =3D ti->slots; + + /* Taken from datasheet */ + pci->cache_line_size =3D 0x0; + pci->pm_cap_off =3D 0x40; + pci->pcie_cap_off =3D 0x70; + pci->msi_cap_off =3D 0x48; + pci->msix_cap_off =3D 0xc0; + pci->msix_bar_nr =3D 0x2; + pci->msix_bar_size =3D 0x800000; + pci->msix_table_off =3D 0x0; + pci->msix_pba_off =3D 0x1000; +} + +static void ti_xhci_class_init(ObjectClass *klass, const void *data) +{ + PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); + DeviceClass *dc =3D DEVICE_CLASS(klass); + + device_class_set_props(dc, ti_xhci_properties); + k->vendor_id =3D PCI_VENDOR_ID_TI; + k->device_id =3D PCI_DEVICE_ID_TI_TUSB73X0; + k->revision =3D 0x02; +} + +static const TypeInfo ti_xhci_info =3D { + .name =3D TYPE_TI_XHCI, + .parent =3D TYPE_XHCI_PCI, + .instance_size =3D sizeof(XHCITiState), + .instance_init =3D ti_xhci_instance_init, + .class_init =3D ti_xhci_class_init, +}; + +static void ti_xhci_register_types(void) +{ + type_register_static(&ti_xhci_info); +} + +type_init(ti_xhci_register_types) diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index 2eecc8d9f26..428200d9e41 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -71,6 +71,8 @@ typedef struct XHCIQState { PCI_VENDOR_ID_REDHAT) #define XHCI_NEC_ID (PCI_DEVICE_ID_NEC_UPD720200 << 16 | \ PCI_VENDOR_ID_NEC) +#define XHCI_TI_ID (PCI_DEVICE_ID_TI_TUSB73X0 << 16 | \ + PCI_VENDOR_ID_TI) =20 /** * Locate, verify, and return a handle to the XHCI device. @@ -932,6 +934,7 @@ int main(int argc, char **argv) TestData td[] =3D { { .device =3D "qemu-xhci", .fingerprint =3D XHCI_QEMU_ID, }, { .device =3D "nec-usb-xhci", .fingerprint =3D XHCI_NEC_ID, }, + { .device =3D "ti-usb-xhci", .fingerprint =3D XHCI_TI_ID, }, }; =20 g_test_init(&argc, &argv, NULL); diff --git a/hw/usb/Kconfig b/hw/usb/Kconfig index 69c663be52f..00d82a97211 100644 --- a/hw/usb/Kconfig +++ b/hw/usb/Kconfig @@ -49,6 +49,11 @@ config USB_XHCI_NEC default y if PCI_DEVICES select USB_XHCI_PCI =20 +config USB_XHCI_TI + bool + default y if PCI_DEVICES + select USB_XHCI_PCI + config USB_XHCI_SYSBUS bool select USB_XHCI diff --git a/hw/usb/meson.build b/hw/usb/meson.build index 17360a5b5a4..375fa420be6 100644 --- a/hw/usb/meson.build +++ b/hw/usb/meson.build @@ -23,6 +23,7 @@ system_ss.add(when: 'CONFIG_USB_XHCI', if_true: files('hc= d-xhci.c')) system_ss.add(when: 'CONFIG_USB_XHCI_PCI', if_true: files('hcd-xhci-pci.c'= )) system_ss.add(when: 'CONFIG_USB_XHCI_SYSBUS', if_true: files('hcd-xhci-sys= bus.c')) system_ss.add(when: 'CONFIG_USB_XHCI_NEC', if_true: files('hcd-xhci-nec.c'= )) +system_ss.add(when: 'CONFIG_USB_XHCI_TI', if_true: files('hcd-xhci-ti.c')) system_ss.add(when: 'CONFIG_USB_DWC2', if_true: files('hcd-dwc2.c')) system_ss.add(when: 'CONFIG_USB_DWC3', if_true: files('hcd-dwc3.c')) system_ss.add(when: 'CONFIG_USB_CHIPIDEA', if_true: files('chipidea.c')) --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156735; cv=none; d=zohomail.com; s=zohoarc; b=WwpA0k9SIM1mo5dQBzzKCZg+/EHphJ4cVjv9Fhbm+kjiVhT62OHF3YRTVNtHhSpj3dXOqgJ0Vc69TFOz+A1bKisS41WNiS6yT8IirArLm3ICKn0+jBeNvhrSZsaPBwZD6Ya863qvQy8Xjd4f2nCJAGkV95asZP80lku+pKm/YJk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156735; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=TAv+aGTQCrwaNulgDta+PXng9GQbHKS2fnPZhRa5POQ=; b=IsmWrxVt3NwFvXDJZK67tH3WKWqnfnODa9YoLcds548jj6xbsksI6qNXWWGEzODEbDl7Kjhsw5hCuGtQy0HEL7VtzCMov4LIFA1gXRuftIMRcWU4F8mHeNUI7rn7Pjl7dv6MZZyQLtGJfUY06EIDCMm1DzO6nU/8RH8j4oIGa+0= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156735183714.4726202255289; Thu, 1 May 2025 20:32:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8E-0004nN-LT; Thu, 01 May 2025 23:32:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh83-0004iY-To for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:00 -0400 Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh81-0001J4-Qo for qemu-devel@nongnu.org; Thu, 01 May 2025 23:31:59 -0400 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-7399838db7fso1785700b3a.0 for ; Thu, 01 May 2025 20:31:57 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:31:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156716; x=1746761516; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TAv+aGTQCrwaNulgDta+PXng9GQbHKS2fnPZhRa5POQ=; b=CKwqF6oO2KoabzBGbCf54PTh5ECr8ommNlby9g7F65ltU8mq8ZUZTvMA95yAeSNj6G XtVCc51ZqDwX0C8zoBmOUYqbYw/+Zng9odIwWS8MLjQK0rwZn1e6d28+rxMlbl5JuvFu kzWjqLX8mPQhzo4D7xR41ku3nI4UXMk45NgPGBQhnlp8Fmhk3XQVx3sp2VEyjAryqRV4 To39cF7TPa3szkq35gLyb2VPdLfp8WUCxToWJhpT/BrX2wA4UNcTUXNxK4KPoTnCMIM+ VMQYyuy0Rurc1j2Yx1F0OXKFl5UZMqfnG3flxZ+rrby+RioENzXIr8L9u38mSK1aEzHo tngQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156716; x=1746761516; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TAv+aGTQCrwaNulgDta+PXng9GQbHKS2fnPZhRa5POQ=; b=Iy4Xnub17ZPlZ3qdER6glvVtJ0YXdOtzTFZQo9bJT4lN425x7No9aBeCJh3/7KbzMh i3uAtrPQRdddCrm6RKzrZ2eqxvNv3mILjZsCIEn37EnBFSeK9BSo51KfSsQigfVXmh1f 2KJvxc71fdx4CUAkxsRiXVHqTeVIVJUdxZHzucWBPeJvt2PhVioP8YXMZQePXtzDiUOK ZXXrRjWrqSE83c7j+GyhW1akPRPkH0bBxeUT5jHYPGhhOinw6VGesxcUYakC2nwc93ss TNUmR7bUayzW+1mbH3uyaCtw30qr+K0TPlqyJdH7ZtA94d1vdDX2AsJ5rai5CU5Ozcgk TCMA== X-Forwarded-Encrypted: i=1; AJvYcCWoGmwEvzJYz7Ayqv9fAYPu6ps/MRXLxPR/DtDD/FlQjeK6nSHbQI+Zlw6FjFbJaU6TrD2ciadVgKuR@nongnu.org X-Gm-Message-State: AOJu0Yz66cwhYrZfV/pxOukvXgFwjEjzoc/EJNCezop6ilr9meSceDKF qhf3GV8CZ+uzehiRxHjMKvvN70aEi7qbE2zwfcpXvphj9a5eGaKIDulnCQ== X-Gm-Gg: ASbGncvlxYUOB9JZw42pYHU5HE4uqvlanOJH5XvbT7zESr3Zu/ivqHngAabvviPjB7L S60/hzybQrFwF2GL/hYisAtmRfGauR9f6zWjlLsF+Q7v2xQPAO1HoszTJiY9v5GdS0G/iQBzFIb I3wsBWuf0c4+slBgWa4eikzR89b6K1xM252fQobjKe8TdsgSmgWILk+wiq4W4lLMKM68a57cXbo 71lJaZ6ttYRYNy0PdUnc9x50ZlVOsjpudoSxh6bR25tUVOHqSFWj+0AGKbZHxYpDNh3B3TKtWKn mJTs6CxB1bsA+5Pei2u3RFqv5Qn66vzHFhd7lnMyyfYb X-Google-Smtp-Source: AGHT+IG7m47e5cg0h0QDZNsDHVQXSy7hw2KvLmbz4m/WCnlu63U+kMK7d/FXqJMiCpzqAn8rUT9QAg== X-Received: by 2002:a05:6a00:e8f:b0:740:6f6:7338 with SMTP id d2e1a72fcca58-7404917149cmr8072520b3a.3.1746156715737; Thu, 01 May 2025 20:31:55 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 11/22] usb/msd: Split in and out packet handling Date: Fri, 2 May 2025 13:30:35 +1000 Message-ID: <20250502033047.102465-12-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42c; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42c.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156738281019100 Content-Type: text/plain; charset="utf-8" Split in and out packet handling int otheir own functions, to make them a bit more managable. Signed-off-by: Nicholas Piggin Reviewed-by: Kevin Wolf --- hw/usb/dev-storage.c | 266 +++++++++++++++++++++++-------------------- 1 file changed, 145 insertions(+), 121 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index b13fe345c45..394fb8e1ec0 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -395,158 +395,182 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPa= cket *p) } } =20 -static void usb_msd_handle_data(USBDevice *dev, USBPacket *p) +static void usb_msd_handle_data_out(USBDevice *dev, USBPacket *p) { MSDState *s =3D (MSDState *)dev; uint32_t tag; struct usb_msd_cbw cbw; - uint8_t devep =3D p->ep->nr; SCSIDevice *scsi_dev; int len; =20 - if (s->needs_reset) { - p->status =3D USB_RET_STALL; - return; - } + switch (s->mode) { + case USB_MSDM_CBW: + if (p->iov.size !=3D 31) { + error_report("usb-msd: Bad CBW size"); + goto fail; + } + usb_packet_copy(p, &cbw, 31); + if (le32_to_cpu(cbw.sig) !=3D 0x43425355) { + error_report("usb-msd: Bad signature %08x", + le32_to_cpu(cbw.sig)); + goto fail; + } + scsi_dev =3D scsi_device_find(&s->bus, 0, 0, cbw.lun); + if (scsi_dev =3D=3D NULL) { + error_report("usb-msd: Bad LUN %d", cbw.lun); + goto fail; + } + tag =3D le32_to_cpu(cbw.tag); + s->data_len =3D le32_to_cpu(cbw.data_len); + if (s->data_len =3D=3D 0) { + s->mode =3D USB_MSDM_CSW; + } else if (cbw.flags & 0x80) { + s->mode =3D USB_MSDM_DATAIN; + } else { + s->mode =3D USB_MSDM_DATAOUT; + } + trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, + cbw.cmd_len, s->data_len); + assert(le32_to_cpu(s->csw.residue) =3D=3D 0); + s->scsi_len =3D 0; + s->req =3D scsi_req_new(scsi_dev, tag, cbw.lun, + cbw.cmd, cbw.cmd_len, NULL); + if (s->commandlog) { + scsi_req_print(s->req); + } + len =3D scsi_req_enqueue(s->req); + if (len) { + scsi_req_continue(s->req); + } + break; =20 - switch (p->pid) { - case USB_TOKEN_OUT: - if (devep !=3D 2) + case USB_MSDM_DATAOUT: + trace_usb_msd_data_out(p->iov.size, s->data_len); + if (p->iov.size > s->data_len) { goto fail; + } =20 - switch (s->mode) { - case USB_MSDM_CBW: - if (p->iov.size !=3D 31) { - error_report("usb-msd: Bad CBW size"); - goto fail; - } - usb_packet_copy(p, &cbw, 31); - if (le32_to_cpu(cbw.sig) !=3D 0x43425355) { - error_report("usb-msd: Bad signature %08x", - le32_to_cpu(cbw.sig)); - goto fail; - } - scsi_dev =3D scsi_device_find(&s->bus, 0, 0, cbw.lun); - if (scsi_dev =3D=3D NULL) { - error_report("usb-msd: Bad LUN %d", cbw.lun); - goto fail; - } - tag =3D le32_to_cpu(cbw.tag); - s->data_len =3D le32_to_cpu(cbw.data_len); - if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; - } else if (cbw.flags & 0x80) { - s->mode =3D USB_MSDM_DATAIN; - } else { - s->mode =3D USB_MSDM_DATAOUT; - } - trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, - cbw.cmd_len, s->data_len); - assert(le32_to_cpu(s->csw.residue) =3D=3D 0); - s->scsi_len =3D 0; - s->req =3D scsi_req_new(scsi_dev, tag, cbw.lun, cbw.cmd, cbw.c= md_len, NULL); - if (s->commandlog) { - scsi_req_print(s->req); - } - len =3D scsi_req_enqueue(s->req); + if (s->scsi_len) { + usb_msd_copy_data(s, p); + } + if (le32_to_cpu(s->csw.residue)) { + len =3D p->iov.size - p->actual_length; if (len) { - scsi_req_continue(s->req); + usb_packet_skip(p, len); + if (len > s->data_len) { + len =3D s->data_len; + } + s->data_len -=3D len; + if (s->data_len =3D=3D 0) { + s->mode =3D USB_MSDM_CSW; + } } - break; + } + if (p->actual_length < p->iov.size) { + trace_usb_msd_packet_async(); + s->packet =3D p; + p->status =3D USB_RET_ASYNC; + } + break; =20 - case USB_MSDM_DATAOUT: - trace_usb_msd_data_out(p->iov.size, s->data_len); - if (p->iov.size > s->data_len) { - goto fail; - } + default: + goto fail; + } + return; =20 - if (s->scsi_len) { - usb_msd_copy_data(s, p); - } - if (le32_to_cpu(s->csw.residue)) { - len =3D p->iov.size - p->actual_length; - if (len) { - usb_packet_skip(p, len); - if (len > s->data_len) { - len =3D s->data_len; - } - s->data_len -=3D len; - if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; - } - } - } - if (p->actual_length < p->iov.size) { - trace_usb_msd_packet_async(); - s->packet =3D p; - p->status =3D USB_RET_ASYNC; - } - break; +fail: + p->status =3D USB_RET_STALL; +} =20 - default: +static void usb_msd_handle_data_in(USBDevice *dev, USBPacket *p) +{ + MSDState *s =3D (MSDState *)dev; + int len; + + switch (s->mode) { + case USB_MSDM_DATAOUT: + if (s->data_len !=3D 0 || p->iov.size < 13) { goto fail; } + /* Waiting for SCSI write to complete. */ + trace_usb_msd_packet_async(); + s->packet =3D p; + p->status =3D USB_RET_ASYNC; break; =20 - case USB_TOKEN_IN: - if (devep !=3D 1) + case USB_MSDM_CSW: + if (p->iov.size < 13) { goto fail; + } =20 - switch (s->mode) { - case USB_MSDM_DATAOUT: - if (s->data_len !=3D 0 || p->iov.size < 13) { - goto fail; - } - /* Waiting for SCSI write to complete. */ + if (s->req) { + /* still in flight */ trace_usb_msd_packet_async(); s->packet =3D p; p->status =3D USB_RET_ASYNC; - break; + } else { + usb_msd_send_status(s, p); + s->mode =3D USB_MSDM_CBW; + } + break; =20 - case USB_MSDM_CSW: - if (p->iov.size < 13) { - goto fail; + case USB_MSDM_DATAIN: + trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); + if (s->scsi_len) { + usb_msd_copy_data(s, p); + } + if (le32_to_cpu(s->csw.residue)) { + len =3D p->iov.size - p->actual_length; + if (len) { + usb_packet_skip(p, len); + if (len > s->data_len) { + len =3D s->data_len; + } + s->data_len -=3D len; + if (s->data_len =3D=3D 0) { + s->mode =3D USB_MSDM_CSW; + } } + } + if (p->actual_length < p->iov.size && s->mode =3D=3D USB_MSDM_DATA= IN) { + trace_usb_msd_packet_async(); + s->packet =3D p; + p->status =3D USB_RET_ASYNC; + } + break; =20 - if (s->req) { - /* still in flight */ - trace_usb_msd_packet_async(); - s->packet =3D p; - p->status =3D USB_RET_ASYNC; - } else { - usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; - } - break; + default: + goto fail; + } + return; =20 - case USB_MSDM_DATAIN: - trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); - if (s->scsi_len) { - usb_msd_copy_data(s, p); - } - if (le32_to_cpu(s->csw.residue)) { - len =3D p->iov.size - p->actual_length; - if (len) { - usb_packet_skip(p, len); - if (len > s->data_len) { - len =3D s->data_len; - } - s->data_len -=3D len; - if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; - } - } - } - if (p->actual_length < p->iov.size && s->mode =3D=3D USB_MSDM_= DATAIN) { - trace_usb_msd_packet_async(); - s->packet =3D p; - p->status =3D USB_RET_ASYNC; - } - break; +fail: + p->status =3D USB_RET_STALL; +} + +static void usb_msd_handle_data(USBDevice *dev, USBPacket *p) +{ + MSDState *s =3D (MSDState *)dev; + uint8_t devep =3D p->ep->nr; =20 - default: + if (s->needs_reset) { + p->status =3D USB_RET_STALL; + return; + } + + switch (p->pid) { + case USB_TOKEN_OUT: + if (devep !=3D 2) { + goto fail; + } + usb_msd_handle_data_out(dev, p); + break; + + case USB_TOKEN_IN: + if (devep !=3D 1) { goto fail; } + usb_msd_handle_data_in(dev, p); break; =20 default: --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156741; cv=none; d=zohomail.com; s=zohoarc; b=a66irIZC51izGNLyHYW1EsO2DQ3J0HbqBi/iu90kS27ujC2AFij/rMvoJT2qv9rIfWWFxTP1ubM3V6FrXvck/v4S3tPiSrpRacsHNZdRM0BEcDDE0AQ3KRbn3UalFFbW452V1rdmkdZXVEPHpeZNy+f6wGCXRXX+9ss5ksHjrrs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156741; 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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=EdcBmlZ41fztrDxg8OzWqVn83Qj5ovbs7ZwEC3huu1Y=; b=hUvXD2XYy1FNWPOJju6q6pyoH07DRCBr03gINIb45NHAt6+q5qNzXtD/ZsIiOAutoDXHRatRbxsSAp6dRwKbec0kpMjgvBEoCCjPxhM9KqnhpnvTVrlvyMws2YCSHkc+V0hLqXmF4R8edMwSs5iFdoC8HFZg5jegx8pRedUWutI= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156741348584.5194237851318; Thu, 1 May 2025 20:32:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8I-0004p9-CX; Thu, 01 May 2025 23:32:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh87-0004jg-Qz for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:06 -0400 Received: from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh86-0001JS-7m for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:03 -0400 Received: by mail-pf1-x42a.google.com with SMTP id d2e1a72fcca58-7376dd56f8fso2321491b3a.2 for ; Thu, 01 May 2025 20:32:01 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.31.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156721; x=1746761521; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EdcBmlZ41fztrDxg8OzWqVn83Qj5ovbs7ZwEC3huu1Y=; b=dJcwK+He85fa3hWEgTR3ShzIyHdqj9NNrKJJXLJHcCg+4vfZuPIFQBuQzHK8FWZu/q RGgt0RaxZcktfR35Azgg2JNSLi+VR4yUYwPum9puBlRM2wLHlwfbn7YddZFV608RyZA2 qO6LOqTBs66htXOW5WADIcgCmsZCrcVRFH8egDW3/14qCDBGJ458z8FmTWMelAs5gmMK mLkRfCJUtujmUoj8mgXnlO6IKQCMW3xglzNdvmJu/l2JYT1ZrS0mRfkpl+I0i5eZx1bj 4nZ+/BjAw+eqrDVTtq/k/bFIOxsRY3XLYnK5HV1H/KN8lKM1+OC6jkBcMKru0QrF32Yn 26jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156721; x=1746761521; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EdcBmlZ41fztrDxg8OzWqVn83Qj5ovbs7ZwEC3huu1Y=; b=hkKcEfjy7YyeX7JRcyfTd3hjtjf7bOrwgdgVIK2jU49Gtuh/mat+VR0whFnZYbtKwA 6vwO6PQkYqcNn4K+IkZ6zhQQCtZGEZxr+C2yV2YKZhsKjHSEd4NdGWllcors+YFBfuLd cp6BYjgC5lo5LE3UoB1omKV/HXyIrh+IMjhX6m8pJQv9S9yagZBZq6o6f2BHmhF1fWWc fz07A9WJe1g24TPbwg2uNSpBH+EI2j98MJYE8w5JEI4CHmvwRkCnrjPExsFRroa8W9WG PJGQbLngcfbl7kFBbCe5YfL74vbm/k62lBOlPuWS1WsuTcnaTf8jr1H3hw5V5gsO5Lbj t/Ag== X-Forwarded-Encrypted: i=1; AJvYcCXcESEfG4Z6DQeDEDAXbotALpqW1KSnrblZlF46ebszwzxxnpsxT4ma6DuRM/0hBD6EZrSVt0xpqX7M@nongnu.org X-Gm-Message-State: AOJu0YyJKUsztT3Aft2B8+lH1J11v8VfLhI/RX9qziN4PpFA7/aXK8BH uZA1sFi76YEE6iIgjTHWdDE9yVwDREHkleEtgQMCe7s8jaWVrMhrltLCGg== X-Gm-Gg: ASbGncsOQiAdNsqSE4bbe47ZXVcn85+OlEuQ8UdaDzHLy/vw5smXVYlklRI1RdZqGkW sqXS5Zxf90k/+A/LqgniPIA5RiXEnPrPD2ll7BP+kvHYIQ8KDxfdZX1+2uh6FwRNXzYyq/jANKO kjOy40wDKfHmclnfwrZ3ZQp7wenj0LV1K2W70fC0yKekhApa3cGbn8ikmS9N/4tp2atLcPwUzi8 9gXcZ07JdbJ2jrGK5WtXhs07pF3pqyqd856LK/lep1CRLe2mY7FjwZPB1UAo2j1P1sLp6uSHeBx 1dUrEH6w2tgN/OI2sT8KYeZHVpa2Qe1+sUmpvMGtEzlI X-Google-Smtp-Source: AGHT+IHvgD0K5P5ZYydqJtVAL2Z7Zs+Y2t/uEFj/aFLKRgU5joQGot/Zqajj7Ct3gZX2KdOaWcUtBA== X-Received: by 2002:a05:6a00:8c04:b0:736:457b:9858 with SMTP id d2e1a72fcca58-74058a188d7mr1736038b3a.10.1746156720862; Thu, 01 May 2025 20:32:00 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 12/22] usb/msd: Ensure packet structure layout is correct Date: Fri, 2 May 2025 13:30:36 +1000 Message-ID: <20250502033047.102465-13-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42a; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42a.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156743183019100 These structures are hardware interfaces, ensure the layout is correct. Add defines for the data sizes throughout the code. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Nicholas Piggin Reviewed-by: Kevin Wolf --- hw/usb/dev-storage.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 394fb8e1ec0..41924b9320e 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -27,7 +27,14 @@ #define MassStorageReset 0xff #define GetMaxLun 0xfe =20 -struct usb_msd_cbw { +/* + * CBW and CSW packets have a minimum size, enough to contain the + * respective data structure. + */ +#define CBW_SIZE sizeof(struct usb_msd_cbw) +#define CSW_SIZE sizeof(struct usb_msd_csw) + +struct QEMU_PACKED usb_msd_cbw { uint32_t sig; uint32_t tag; uint32_t data_len; @@ -405,11 +412,11 @@ static void usb_msd_handle_data_out(USBDevice *dev, U= SBPacket *p) =20 switch (s->mode) { case USB_MSDM_CBW: - if (p->iov.size !=3D 31) { + if (p->iov.size !=3D CBW_SIZE) { error_report("usb-msd: Bad CBW size"); goto fail; } - usb_packet_copy(p, &cbw, 31); + usb_packet_copy(p, &cbw, CBW_SIZE); if (le32_to_cpu(cbw.sig) !=3D 0x43425355) { error_report("usb-msd: Bad signature %08x", le32_to_cpu(cbw.sig)); @@ -489,7 +496,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) =20 switch (s->mode) { case USB_MSDM_DATAOUT: - if (s->data_len !=3D 0 || p->iov.size < 13) { + if (s->data_len !=3D 0 || p->iov.size < CSW_SIZE) { goto fail; } /* Waiting for SCSI write to complete. */ @@ -499,7 +506,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) break; =20 case USB_MSDM_CSW: - if (p->iov.size < 13) { + if (p->iov.size < CSW_SIZE) { goto fail; } =20 @@ -636,6 +643,10 @@ static const TypeInfo usb_storage_dev_type_info =3D { =20 static void usb_msd_register_types(void) { + /* Ensure the header structures are the right size */ + qemu_build_assert(CBW_SIZE =3D=3D 31); + qemu_build_assert(CSW_SIZE =3D=3D 13); + type_register_static(&usb_storage_dev_type_info); } =20 --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156741; cv=none; d=zohomail.com; s=zohoarc; b=TLcVg2JXgIqmhoQk/TWzfnH/NYVR/JW+3kzMAxnzUI7JnoHM50tb+mqNLR/jBgqc0uxLptVOHCYmFvJT2e5EhrAcXKkvsE3xug9+Knmz31EcYWGzSkFNNtIV57IBNd70FvL8wgXKCLIfDaTTFiJACN+JApvdQALq420lohARoMU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156741; 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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=la/nrh6lZr7amj/W+LQ5Z/E6fUVMMUf0PMLIoeHd1gc=; b=QjM3dBaYBU/Ysb1SjipfyWoxrKBFIMTUJxbIcHiy6DCHjlQLht7AyZlEzDnskhQcWHNKULOyv2u/r50NGmnZ5N8/WxRfeQo3q1HwSawGCcibRQ9E2OHt/0Un2p5skVHnOadYriHHTDRJ0TTHey/R3veoGovrptGZMXITA9tNw1M= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156741057246.82024274363198; Thu, 1 May 2025 20:32:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8M-000539-Bo; Thu, 01 May 2025 23:32:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8I-0004px-7w for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:14 -0400 Received: from mail-pf1-x435.google.com ([2607:f8b0:4864:20::435]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8C-0001K6-16 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:12 -0400 Received: by mail-pf1-x435.google.com with SMTP id d2e1a72fcca58-7399a2dc13fso2422143b3a.2 for ; Thu, 01 May 2025 20:32:07 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156726; x=1746761526; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=la/nrh6lZr7amj/W+LQ5Z/E6fUVMMUf0PMLIoeHd1gc=; b=R4zGAZG1GJvhUrU+1pA0Gi7a5CiQZTkyJ+65dV4WBiykTmMI/Qv3axw/ZyMNxvA+Ts X9Ck22pxoNfmqmyucMZl8F/jpTzrVwWc6kN+XuThOhQ9mUkhvyKeeMn52SxihT/a+MVI TofvY/Ni4p2CCqxZi1Bc3b8NduO2HbzuXVuAy/aGMX/FtX0Twg0W4CNk0VHw31Ttpb2w eZP/r6sUwmTuWfY2ej9FTMvsresMAU1P4N3OG91jfx9l0g8TlqoyEpyLQJSV8iczJYsw mQP7OZ1Hh0XLoh2GntGuyoNyiPn54GNLovHxxN6NdLRPpoPf5UBoyq4UjyjTVwU5L50D 4PWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156726; x=1746761526; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=la/nrh6lZr7amj/W+LQ5Z/E6fUVMMUf0PMLIoeHd1gc=; b=fRyXqDvynmHZ8zcQvl+4CTE/STSTizP+5I9vF8uH1Qi/V3SrhX0dBMWY+Z2ACN08B5 bg7atzyM7Kkh/fsEZyvJNqQLKzaXa2yZh/MPEn/QUA4hF1EMdhYQhVspgLLS9m32JDaa AA8on8sMbbAUCEQCtrNuc2ImAhc9fxV1KPvWUb3OA7+XxTjKjAsy0fdffYXjkbnDKbHT w0qLUoHRcA2DTwga+h+CRSCcgNXT3QdlXHBC5OFma8OovWidIIPkbqHyDxCxzGF9vY9P t2IRxUjD1NURjsyZ3Azm0YthYs7//vnCEvjtemmyhWxzmB0QnwvA05OLqooyOWgXZsXW aInw== X-Forwarded-Encrypted: i=1; AJvYcCWiqXdEdVL+lujFc6PxsjIUgWj+fNKNNuPsH2Uq99RZhDgb0wE/b5wYTSwFH5lQEV8m7kiqojvg/SQr@nongnu.org X-Gm-Message-State: AOJu0YxRqCpOHuMDVQBJAOFopvECw30fa5fdBgLwbt0vL7kOqGqYG8Sg CjKgSZrWRI7hnnsH2mSB8B7Xjt+hkPZUNBNRGNXe7f/Iq44QahOGbYSUAA== X-Gm-Gg: ASbGnctvlDbxMfRQ92QiWJieGikTjxNy2QyIm/NqKV4C4O3SxhU8BF7PIOpuN4giqL+ BVdmn7Y0wnN/mla38zMsmWrGbKvG0MM4/VvXaj/G0pJVTd3mqgT1hhrEQZYWTLpGBa4HKb7oB/G VkdV4c++OzvhnAXiiIJtbeQN4X6djdJR//7YaCG9yUBKLdrzZBFIEf/y9292hlfQCwmFYxUeVJS 4Ne2nf9/C85VxJk9HIvaC/19UgOIs/V7HrBEh1eWi2yDWRKNDMoNIbQzcGCEiYP2nLf3qJSmLh0 RwTn0YTq8DB+D5ASI74bWj79m01FuOcEsPHEjPZoz4uu X-Google-Smtp-Source: AGHT+IH1KsdswN0zKZRDXnauC1VJAkJvyrzy7XJ4Zrzm+EEYdaUcmxx4AHQWNBs45+OhwL/DyzUDSA== X-Received: by 2002:a05:6a00:8d8d:b0:736:31cf:2590 with SMTP id d2e1a72fcca58-74058aea47emr1783610b3a.16.1746156726024; Thu, 01 May 2025 20:32:06 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 13/22] usb/msd: Improved handling of mass storage reset Date: Fri, 2 May 2025 13:30:37 +1000 Message-ID: <20250502033047.102465-14-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::435; envelope-from=npiggin@gmail.com; helo=mail-pf1-x435.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156742717124100 The mass storage reset request handling does not reset in-flight SCSI requests or USB MSD packets. Implement this by calling the device reset handler which should take care of everything. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Nicholas Piggin --- hw/usb/dev-storage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 41924b9320e..fda14271eae 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -366,7 +366,7 @@ static void usb_msd_handle_control(USBDevice *dev, USBP= acket *p, /* Class specific requests. */ case ClassInterfaceOutRequest | MassStorageReset: /* Reset state ready for the next CBW. */ - s->mode =3D USB_MSDM_CBW; + usb_msd_handle_reset(dev); break; case ClassInterfaceRequest | GetMaxLun: maxlun =3D 0; --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156871; cv=none; d=zohomail.com; s=zohoarc; b=k8zbQ7ndHci2CVRJ/76oR7JPI+sr7xoQpcQU9acur36flRmv1XUGOJrRA1DZnSWMPHzXYaK8T92eL+sP4pDJKs5kszdVNAZEi1j6IOjpVieZZcZWSfoBKBVURRZFF9MLkpoSi45zYVZ1t1KM+2aVUA3enrfxHxas3e+mWtTBbWM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156871; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=MvZGBCpwgyIhQnVbt40juvV6gQDetZ0AELHdCIOiZlg=; b=OzL2zAgXI5louJrVrVdM6kdLrtJ3fWy5g2ulOFhtWHbcp60ax/eAC9kAqub8f93uzub4yiChq3+MDoWmD4Ii+1EFPQvFZC5DrstOJrlJ49XTHVnm+QFe8PZFQuODuI8e9iyFyz9sBWBviCBmafmO5tPqQBiBKfMpLbE8p8luJQs= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156871328691.2347606192268; Thu, 1 May 2025 20:34:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8O-0005HK-Qx; Thu, 01 May 2025 23:32:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8K-0004tt-EA for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:16 -0400 Received: from mail-pf1-x429.google.com ([2607:f8b0:4864:20::429]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8I-0001KN-0q for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:15 -0400 Received: by mail-pf1-x429.google.com with SMTP id d2e1a72fcca58-736a7e126c7so1507747b3a.3 for ; Thu, 01 May 2025 20:32:12 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156731; x=1746761531; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MvZGBCpwgyIhQnVbt40juvV6gQDetZ0AELHdCIOiZlg=; b=QIfwgNTSZQad8lLGHkve8W4EghZJflWYmXd90/Z6uPvANXWbpRmZ0qihaBdQuDEDv+ E3ai8/ikpvxbqxhkh9FpeTPX1imFvYmG6KozomeVCa/fvuWQ85wNZtWHJpmqWaBYYG27 MYD+RqnA+Ao2nz7BCjQEVeeFcYBXhlhqw6MbbHznWg5ELZL3MB16XBpi45RmYZlCZblI Lh+8QX7Sl09xTWJLUYlhjaCXLofcp1ZvDi5zr6+xglXX1zBcb0o5+C+Id8sBSSB6pX2y 3WyOnlNuopJKm1UV03Wh5dQykudryZNz6Wi0vvcYKCMgaA47Rnlm7ecyeNkvWx8YCHGm dIww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156731; x=1746761531; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MvZGBCpwgyIhQnVbt40juvV6gQDetZ0AELHdCIOiZlg=; b=KZhn3Tr2TGEm9gmL1/RhVxkGe6aJreNwSGE9+lDfX138mivZdORPCU4zeGRbIjTwk/ aWbVYcDIVIzvCee4+0TE2KxBA4LV4jr+rLUeTmDR4jHyzO5mpNMeLCuhl35bdEfp3BHm hNrru79eAkBEvmYGj2jnXu/9ITBEd7Ov/4eVzocMrmT9gan1uAUsd6ekJIiYM8U1O5Cv gIui8L11YYXYP5haMxIUTZUFHfySnf74smht5S5sWgNzMYxWwixid41y0+6pvBQgrbot cFrej7eY0lBfy/F4gJdSQhSK1StwJtlf1uKHV9hG08SuyGEuiCLwwY4Rj/CtHhyfXmk3 SN9w== X-Forwarded-Encrypted: i=1; AJvYcCX2uLzrwPknSsTL5YcUk327Ovcc97QQiQloJvvYY6cpKEEUJxCK8WEdUyqLja2AGvmSLJwvK1HfFqfL@nongnu.org X-Gm-Message-State: AOJu0YxPf/Wzo6dIDIN7LXXYWmAeYXxD2M+cD0Ss9kOgSwV/iTruKEUV V1n84oICIs4CWZgnZmqKVkyWUbSuBN0gWgje004ChZf0KNUiF28M X-Gm-Gg: ASbGncshy3Qwfxezzc8sktUjFgXypz0ITLcSuZgrhXaAqF+u79PwxOuos6gSLvQHZy2 fd+cM5XcxDpmFG9hXQ/WHYrM63wQ2brG4KZaLZMZPAFRHpmXs39MoSCW8iE+zfS3x+B/wT2dg/h wUPuH94++Cp8tijiGcGntkpuNEGzqaZJBakdlFieX2UhMvc8Zi8lpJ0wJn1aJELajl45t8uzQ6T Ml9A3/E2qMaVVZw6Y1W99V68cS5O5pxCUKiin4IpyhZJsVogTPpb6DYf6cLWvslDmgapnvC8Ebq CfndcSLmI+IX2lSjuu2yx3LmRCmSHsABzCSrVdEZMjaY X-Google-Smtp-Source: AGHT+IE1E14jsRF4MO3tuPlO10Mjgz2dV4kZctL+gBHEFTAwF1RzqZu3l58C+jVjMQxhcTqhxmV6PQ== X-Received: by 2002:a05:6a00:8d86:b0:73c:b86:b47f with SMTP id d2e1a72fcca58-740589026cemr1881129b3a.4.1746156731228; Thu, 01 May 2025 20:32:11 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 14/22] usb/msd: Improve packet validation error logging Date: Fri, 2 May 2025 13:30:38 +1000 Message-ID: <20250502033047.102465-15-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::429; envelope-from=npiggin@gmail.com; helo=mail-pf1-x429.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156873583019100 Content-Type: text/plain; charset="utf-8" Errors in incoming USB MSD packet format or context would typically be guest software errors. Log these under guest errors. Signed-off-by: Nicholas Piggin Reviewed-by: Kevin Wolf --- hw/usb/dev-storage.c | 53 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index fda14271eae..7bc2f7664b2 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -10,6 +10,7 @@ #include "qemu/osdep.h" #include "qapi/error.h" #include "qemu/error-report.h" +#include "qemu/log.h" #include "qemu/module.h" #include "qemu/option.h" #include "qemu/config-file.h" @@ -402,6 +403,36 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPacke= t *p) } } =20 +static bool try_get_valid_cbw(USBPacket *p, struct usb_msd_cbw *cbw) +{ + uint32_t sig; + + if (p->iov.size !=3D CBW_SIZE) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW size %zu\n", + p->iov.size); + return false; + } + usb_packet_copy(p, cbw, CBW_SIZE); + sig =3D le32_to_cpu(cbw->sig); + if (sig !=3D 0x43425355) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW signature 0x%08x\= n", + sig); + return false; + } + + return true; +} + +static bool check_valid_csw(USBPacket *p) +{ + if (p->iov.size < CSW_SIZE) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CSW size %zu\n", + p->iov.size); + return false; + } + return true; +} + static void usb_msd_handle_data_out(USBDevice *dev, USBPacket *p) { MSDState *s =3D (MSDState *)dev; @@ -412,19 +443,13 @@ static void usb_msd_handle_data_out(USBDevice *dev, U= SBPacket *p) =20 switch (s->mode) { case USB_MSDM_CBW: - if (p->iov.size !=3D CBW_SIZE) { - error_report("usb-msd: Bad CBW size"); - goto fail; - } - usb_packet_copy(p, &cbw, CBW_SIZE); - if (le32_to_cpu(cbw.sig) !=3D 0x43425355) { - error_report("usb-msd: Bad signature %08x", - le32_to_cpu(cbw.sig)); + if (!try_get_valid_cbw(p, &cbw)) { goto fail; } scsi_dev =3D scsi_device_find(&s->bus, 0, 0, cbw.lun); if (scsi_dev =3D=3D NULL) { - error_report("usb-msd: Bad LUN %d", cbw.lun); + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW LUN %d\n", + cbw.lun); goto fail; } tag =3D le32_to_cpu(cbw.tag); @@ -496,9 +521,15 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) =20 switch (s->mode) { case USB_MSDM_DATAOUT: - if (s->data_len !=3D 0 || p->iov.size < CSW_SIZE) { + if (!check_valid_csw(p)) { + goto fail; + } + if (s->data_len !=3D 0) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: CSW received before " + "all data was sent\n"); goto fail; } + /* Waiting for SCSI write to complete. */ trace_usb_msd_packet_async(); s->packet =3D p; @@ -506,7 +537,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) break; =20 case USB_MSDM_CSW: - if (p->iov.size < CSW_SIZE) { + if (!check_valid_csw(p)) { goto fail; } =20 --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156854; cv=none; d=zohomail.com; s=zohoarc; b=SGGr8/IBR2sLsJQJ4ZPoYprUe+1F6YKej4lqS0r3X5R4fHGlWkqEQJnw8CWkTqorD7e0dAhrmdEL1uWIsKkmuQfnwzmiM3O4zpdP+Qu1zyMJCp/wdxOhRugSaZWYt4fV8Zcj36f7UodwQqIhUHDWCy2ek/G9+Txug/uwbVO6Zbs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156854; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=3HVBXIr+NBzPaHLCzg4OvS7X3MwM/imJu6rPVdSQDDI=; b=PV2sMZMHm1iXKJxdprkAQHGOc2w5BaKqWysDT7Xee7f/KKY/vTE/u1yFa9wfhahRIHKCHTJLKI//p3Atg77iDz8x6DTSw/6KluHzjx39HVA7Lx84vttPx8pGFwwaOEa8SCZ8kmSx8xD+kRMG1Dg2s71Us6/182+upljHnX98fZc= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156854803684.4443453031624; Thu, 1 May 2025 20:34:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8Q-0005Kx-V3; Thu, 01 May 2025 23:32:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8N-00059c-IJ for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:19 -0400 Received: from mail-pf1-x430.google.com ([2607:f8b0:4864:20::430]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8L-0001Kj-US for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:19 -0400 Received: by mail-pf1-x430.google.com with SMTP id d2e1a72fcca58-7399838db7fso1785829b3a.0 for ; Thu, 01 May 2025 20:32:17 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156736; x=1746761536; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3HVBXIr+NBzPaHLCzg4OvS7X3MwM/imJu6rPVdSQDDI=; b=Srr/AOkdD/Yd0U0rnXvqDkgENBIuUF4AY0B2r6U+QJpdelONWMP2+z+UWimPh4KeKh 9JHahpukseh5fz5kLpCDRKIXodSo1eAJkQYpN/jXNZPr+24avXfqBdI6QUPGOZ/DxkGi K0S1artHzbvCtpDtvrKBmzkKoUjj7+sgSWmdH60iSzKD4EPyoVs327M+0PdTefKZmsts JixS6xhoaV1TXgMYE39w/1l2Ywo7fsXH0B1N4b/EKy+M9cl5lZwGdF8ZMaWhDf7tjxmz VSD4t5jFGuh0DMHzFCPKsTaBIcnt8G3MCs+8DINpKX40rxIb3qIML3GpxgATPRtynamO Bgsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156736; x=1746761536; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3HVBXIr+NBzPaHLCzg4OvS7X3MwM/imJu6rPVdSQDDI=; b=G2dmwXbqQ6wvk751NLoPttYQOmoEJKzxaEjcvuDY9f0BmAxWNa7lWiDOZ28jtKLnWP TlV3NUnNTTl0PD959y6TMbe9kjdfskVLSkyeoqE1G3E195MFsmiIfe1S9xKLnWsXHfZh w6tU4YvpbSfDsJroR1i1CpCGch9xDSvQqk72GsWBV5t6mvZGOz4XVvnE6xbSAxrR54Ba HiaTz2C+qwBS760uo8uhTocUomVU4h0gS7b6O2UV7FVpx29JvnBGNH+uVpIaT7DFDJ0P Ea+VHhVUih/oAoh6ZNNuFHMQ1AVGOcdzeonSIm8liT+S7FrRbWygdvxlgSyTYceK8CGF y1xA== X-Forwarded-Encrypted: i=1; AJvYcCUyktOzlCxavq0r+5j0Q3kCO1rI69h4pEy4N1rxHGqvQUZr/iPz8yTev52+VG4y6pCZP7nGvz6b6Cnd@nongnu.org X-Gm-Message-State: AOJu0YzoA2x61057cxVHn8TOOuBai96/u6EzN38CE4p8Xdn6zzvuefWL wRntj5dt70P75dM4yPprKNjVVasW9PwtUp73Y5pLA+zSWRXKnqkY X-Gm-Gg: ASbGncvI/GLlgfxhvX80iTJnmNdGy3pwIIAx6M4UYLX54NKv+U2PyoSYtiT2F+01917 CvfoOZxYUWRo0NSMz+dH1Neu2ZVlxX41iXslchGCfMXROdHD++hPXHwYtkE+MHBj+W1i56uVAEG RbFgKv1PHbdwTfAVt0iMBwOI2g6+xOkKaHa1Lx1spaiiHyO+FuKLVsqjW9mrf4ABzHmlBBoXoMF 7bNBits1VhuZxn3GdVnibOd22urpREtSpbm1M3S5+PPsD9P3/CwCVYJFtY2J+B8ohxT/9TPRjM0 psi5+dnxfCdlog7hDlFC1z1qKDtVic4sSkzgpcSMn955EMTowqOG0Fw= X-Google-Smtp-Source: AGHT+IGyAtPi4xyXYIHGt+OQHSSh5M5SnuMk2PEz/T6JNNt51QeQv3YslSZv1gOpro1A+NTdiRommw== X-Received: by 2002:a05:6a00:3774:b0:732:56a7:a935 with SMTP id d2e1a72fcca58-74049265f69mr7089525b3a.12.1746156736358; Thu, 01 May 2025 20:32:16 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 15/22] usb/msd: Allow CBW packet size greater than 31 Date: Fri, 2 May 2025 13:30:39 +1000 Message-ID: <20250502033047.102465-16-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::430; envelope-from=npiggin@gmail.com; helo=mail-pf1-x430.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156857935124100 Content-Type: text/plain; charset="utf-8" The CBW structure is 31 bytes, so CBW DATAOUT packets must be at least 31 bytes. QEMU enforces exactly 31 bytes, but this is inconsistent with how it handles CSW packets (where it allows greater than or equal to 13 bytes) despite wording in the spec[*] being similar for both packet types: "shall end as a short packet with exactly 31 bytes transferred". [*] USB MSD Bulk-Only Transport 1.0 For consistency, and on the principle of being tolerant in accepting input, relax the CBW size check. Alternatively, both checks could be tightened to exact. Or a message could be printed warning of possible guest error if size is not exact, but still accept the packets. Signed-off-by: Nicholas Piggin --- hw/usb/dev-storage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 7bc2f7664b2..fe8955bf212 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -407,7 +407,7 @@ static bool try_get_valid_cbw(USBPacket *p, struct usb_= msd_cbw *cbw) { uint32_t sig; =20 - if (p->iov.size !=3D CBW_SIZE) { + if (p->iov.size < CBW_SIZE) { qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW size %zu\n", p->iov.size); return false; --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156836; cv=none; d=zohomail.com; s=zohoarc; b=IXllzVdKZyfschO5z3BwvsxfzbryqVzf70vr69fzjhFk2dIirVwPgqSED8fJQeACWZhwL/Q+xzQfxtQRaVvEf92I5GaWQ0IX3GjAqBKoFnbPx7aSEHLYrMASxK5YhMpNh3e0V8y8zmhUZMgPyx6YSCitykZb0iMH3HenE0RgL9Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156836; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=n8tiJsmXmh7ujz+DQwMqz4CAbXuxxW7Y55FvEeVv1vo=; b=jC84VTE6OwOneVRNY8oOcQhUPktX8Le75CnloCVYbtuUptECYJuferDDVdFR7PZDGP7HLDIsdjleeQXLcTCKxTs3PeaW/ylVj8w1b+5oqcvwY/997BzVgyDchRBOkhkUoy2PlqiCgLXDhw1SGI36bQRGVAhEriALze+GGO8nfWw= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156836757762.4362403959715; Thu, 1 May 2025 20:33:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8g-0005iz-Fh; Thu, 01 May 2025 23:32:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8U-0005VL-6W for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:26 -0400 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8Q-0001LQ-UF for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:25 -0400 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-7399a2dc13fso2422365b3a.2 for ; Thu, 01 May 2025 20:32:22 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156741; x=1746761541; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=n8tiJsmXmh7ujz+DQwMqz4CAbXuxxW7Y55FvEeVv1vo=; b=T7MfQzMdf29FUG2K5su68PtPmIctgpGpkhIbW6+IXyJwXMjJj44oe72Ct2hcGfYaHN EgtmJuVqo4F9Zq5aLs4dHMrOjCbnnoex8WHMR0xfUfnRo0CTxDrQiOfMAygC7ranTqkI 8fI1xwc1uNku5wscl4NzcFTtyru4aKQtMCLJl7qJ5W0dy2YVtndU72olY12KuS9Qm4Wh wxL25ZAMDfKZ0wF/BmQ8ij/Xg2APcpB6Y1C4TFFro88pFI1M2+cOph9vT/Z7tTajhY5c PeLrq7qpsHV5bVIRYb8ASyn9GsJQE5i+zhKE4dA9bFafa3I8aPGLDToS9XiuJsKqPoWs Q9mQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156741; x=1746761541; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=n8tiJsmXmh7ujz+DQwMqz4CAbXuxxW7Y55FvEeVv1vo=; b=LhNySGlnlIcLxqZd8O6IslsxjTIULrywQTN+Vz3OfB0/owUCniqRv3vCYv6TourWdF U6MgOLLTyVTyNuhmlJ5ao1yyXWDqq7x+BiqIXfoDDojmm4uich5i7FcmpFWtUoedXL1b phTOJLbGHrA2qER5WgovkzLGokuZWb4o6PbNoBjl6meoQxqVahLlHicpNwkzVbzQTJ9o A2qPP2EXnAIT56N5qyUCBlpcvRZZ3LGfaBto/c3hHKKn4gSUhZwsOD0zt/sHrgtYI6T+ 5Pp8nMb+xUMi15t0lMX7Cq/lB0mUvaya8gOUOobFdfr5XOHydLJ5hk2lvOflbWYNaNiy Qnhg== X-Forwarded-Encrypted: i=1; AJvYcCWAKwysDQF6DLdznWj8W/piXxEProkMPO1VbdRvH8oKKT60CGIJubVQVonY6sv6Nl+KwD2+h9vQ5p3e@nongnu.org X-Gm-Message-State: AOJu0YxQbuDNvGmBd56Tyce1TcHX4FAOZXjVLIkem1dHcj6/nE7wIfDM hzr+69i6qwprLI00yJFLOCW3St2I44hnp5aqjImpQ4ig3BhPoCO+ X-Gm-Gg: ASbGncsIHdV+ZGBAVZ+jKdntm1NyN00eg1kPpGWyVMjHsbvZ31qbDtwXvLMZNwxPCbP gdRTZpKEZWNTHxMEZtEiA4iwr0MiEEzcKFd7xswXgArXfY668HX8DWmXfjDi5cJybIL5w/6tD9c 9A8PxB//69OB+bA3XAAGSPI/7r5JNmY5tKZB99e64EcFaqXFVN3sS0KxQQZBPqddT39AebBsB3a +7BihEOpGbKWQ4nfWPEi7vMZBLlgXbqGwTPoehHuv1P/Dikw6W/5bq6VwLutgIFkVXVROjLVy8d VH43yqHyObkyuywLGX5kRrbBstjpzv0Hp5NuqjHehUzQ X-Google-Smtp-Source: AGHT+IHHF6hsA3Q6P8LNTJuBIVfyPAPy4Ys2pteSMpn1iDUMVXZnZpEy3KPe3JAZGErZwZEA68quWg== X-Received: by 2002:a05:6a21:108c:b0:1fe:61a4:71d8 with SMTP id adf61e73a8af0-20cdee3ae3emr1975044637.22.1746156741504; Thu, 01 May 2025 20:32:21 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 16/22] usb/msd: Split async packet tracking into data and csw Date: Fri, 2 May 2025 13:30:40 +1000 Message-ID: <20250502033047.102465-17-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::431; envelope-from=npiggin@gmail.com; helo=mail-pf1-x431.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156837570019100 Content-Type: text/plain; charset="utf-8" The async packet handling logic has places that infer whether the async packet is data or CSW, based on context. This is not wrong, it just makes the logic easier to follow if they are categorised when they are accepted. Signed-off-by: Nicholas Piggin --- include/hw/usb/msd.h | 5 +- hw/usb/dev-storage.c | 121 +++++++++++++++++++++++++++---------------- 2 files changed, 79 insertions(+), 47 deletions(-) diff --git a/include/hw/usb/msd.h b/include/hw/usb/msd.h index f9fd862b529..a40d15f5def 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -33,8 +33,11 @@ struct MSDState { struct usb_msd_csw csw; SCSIRequest *req; SCSIBus bus; + /* For async completion. */ - USBPacket *packet; + USBPacket *data_packet; + USBPacket *csw_in_packet; + /* usb-storage only */ BlockConf conf; bool removable; diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index fe8955bf212..66fffda3713 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -185,18 +185,33 @@ static const USBDesc desc =3D { .str =3D desc_strings, }; =20 -static void usb_msd_packet_complete(MSDState *s, int status) +static void usb_msd_data_packet_complete(MSDState *s, int status) { - USBPacket *p =3D s->packet; + USBPacket *p =3D s->data_packet; =20 /* - * Set s->packet to NULL before calling usb_packet_complete - * because another request may be issued before - * usb_packet_complete returns. + * Set s->data_packet to NULL before calling usb_packet_complete + * because another request may be issued before usb_packet_complete + * returns. */ trace_usb_msd_packet_complete(); + s->data_packet =3D NULL; + p->status =3D status; + usb_packet_complete(&s->dev, p); +} + +static void usb_msd_csw_packet_complete(MSDState *s, int status) +{ + USBPacket *p =3D s->csw_in_packet; + + /* + * Set s->csw_in_packet to NULL before calling usb_packet_complete + * because another request may be issued before usb_packet_complete + * returns. + */ + trace_usb_msd_packet_complete(); + s->csw_in_packet =3D NULL; p->status =3D status; - s->packet =3D NULL; usb_packet_complete(&s->dev, p); } =20 @@ -204,8 +219,12 @@ static void usb_msd_fatal_error(MSDState *s) { trace_usb_msd_fatal_error(); =20 - if (s->packet) { - usb_msd_packet_complete(s, USB_RET_STALL); + if (s->data_packet) { + usb_msd_data_packet_complete(s, USB_RET_STALL); + } + + if (s->csw_in_packet) { + usb_msd_csw_packet_complete(s, USB_RET_STALL); } =20 /* @@ -250,7 +269,7 @@ static void usb_msd_send_status(MSDState *s, USBPacket = *p) void usb_msd_transfer_data(SCSIRequest *req, uint32_t len) { MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); - USBPacket *p =3D s->packet; + USBPacket *p =3D s->data_packet; =20 if ((s->mode =3D=3D USB_MSDM_DATAOUT) !=3D (req->cmd.mode =3D=3D SCSI_= XFER_TO_DEV)) { usb_msd_fatal_error(s); @@ -261,10 +280,10 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t= len) s->scsi_off =3D 0; if (p) { usb_msd_copy_data(s, p); - p =3D s->packet; + p =3D s->data_packet; if (p && p->actual_length =3D=3D p->iov.size) { /* USB_RET_SUCCESS status clears previous ASYNC status */ - usb_msd_packet_complete(s, USB_RET_SUCCESS); + usb_msd_data_packet_complete(s, USB_RET_SUCCESS); } } } @@ -272,7 +291,7 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t l= en) void usb_msd_command_complete(SCSIRequest *req, size_t resid) { MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); - USBPacket *p =3D s->packet; + USBPacket *p =3D s->data_packet; =20 trace_usb_msd_cmd_complete(req->status, req->tag); =20 @@ -281,35 +300,37 @@ void usb_msd_command_complete(SCSIRequest *req, size_= t resid) s->csw.residue =3D cpu_to_le32(s->data_len); s->csw.status =3D req->status !=3D 0; =20 - if (s->packet) { - if (s->data_len =3D=3D 0 && s->mode =3D=3D USB_MSDM_DATAOUT) { - /* A deferred packet with no write data remaining must be - the status read packet. */ - usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; - } else if (s->mode =3D=3D USB_MSDM_CSW) { - usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; - } else { - if (s->data_len) { - int len =3D (p->iov.size - p->actual_length); - usb_packet_skip(p, len); - if (len > s->data_len) { - len =3D s->data_len; - } - s->data_len -=3D len; - } - if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + scsi_req_unref(req); + s->req =3D NULL; + + if (p) { + g_assert(s->mode =3D=3D USB_MSDM_DATAIN || s->mode =3D=3D USB_MSDM= _DATAOUT); + if (s->data_len) { + int len =3D (p->iov.size - p->actual_length); + usb_packet_skip(p, len); + if (len > s->data_len) { + len =3D s->data_len; } + s->data_len -=3D len; + } + if (s->data_len =3D=3D 0) { + s->mode =3D USB_MSDM_CSW; } /* USB_RET_SUCCESS status clears previous ASYNC status */ - usb_msd_packet_complete(s, USB_RET_SUCCESS); + usb_msd_data_packet_complete(s, USB_RET_SUCCESS); } else if (s->data_len =3D=3D 0) { s->mode =3D USB_MSDM_CSW; } - scsi_req_unref(req); - s->req =3D NULL; + + if (s->mode =3D=3D USB_MSDM_CSW) { + p =3D s->csw_in_packet; + if (p) { + usb_msd_send_status(s, p); + s->mode =3D USB_MSDM_CBW; + /* USB_RET_SUCCESS status clears previous ASYNC status */ + usb_msd_csw_packet_complete(s, USB_RET_SUCCESS); + } + } } =20 void usb_msd_request_cancelled(SCSIRequest *req) @@ -339,8 +360,12 @@ void usb_msd_handle_reset(USBDevice *dev) } assert(s->req =3D=3D NULL); =20 - if (s->packet) { - usb_msd_packet_complete(s, USB_RET_STALL); + if (s->data_packet) { + usb_msd_data_packet_complete(s, USB_RET_STALL); + } + + if (s->csw_in_packet) { + usb_msd_csw_packet_complete(s, USB_RET_STALL); } =20 memset(&s->csw, 0, sizeof(s->csw)); @@ -395,11 +420,15 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPack= et *p) { MSDState *s =3D USB_STORAGE_DEV(dev); =20 - assert(s->packet =3D=3D p); - s->packet =3D NULL; - - if (s->req) { - scsi_req_cancel(s->req); + if (p =3D=3D s->data_packet) { + s->data_packet =3D NULL; + if (s->req) { + scsi_req_cancel(s->req); + } + } else if (p =3D=3D s->csw_in_packet) { + s->csw_in_packet =3D NULL; + } else { + g_assert_not_reached(); } } =20 @@ -500,7 +529,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) } if (p->actual_length < p->iov.size) { trace_usb_msd_packet_async(); - s->packet =3D p; + s->data_packet =3D p; p->status =3D USB_RET_ASYNC; } break; @@ -532,7 +561,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) =20 /* Waiting for SCSI write to complete. */ trace_usb_msd_packet_async(); - s->packet =3D p; + s->csw_in_packet =3D p; p->status =3D USB_RET_ASYNC; break; =20 @@ -544,7 +573,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) if (s->req) { /* still in flight */ trace_usb_msd_packet_async(); - s->packet =3D p; + s->csw_in_packet =3D p; p->status =3D USB_RET_ASYNC; } else { usb_msd_send_status(s, p); @@ -572,7 +601,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) } if (p->actual_length < p->iov.size && s->mode =3D=3D USB_MSDM_DATA= IN) { trace_usb_msd_packet_async(); - s->packet =3D p; + s->data_packet =3D p; p->status =3D USB_RET_ASYNC; } break; --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156849; cv=none; d=zohomail.com; s=zohoarc; b=bNK8NmImflQieNT2GEBzggbPtgumGb1V4DgsYarXAMSf/5ZqZjvP/5xgWJinO2jOS6YEvq7hAPGKa01aniMH9qF7t65t3MvQG7f2TGmAj7AWrD5HYlDdptkCnM2F0dAr+traAeOzCkEJOf2OWClFfEIqmZJmO73NFZys7+uOLmY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156849; 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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=RcPVYeeQT1GwwWrtzjsEjtZuBAgtjHa2HHwNwJdBE50=; b=Af5onJY6hslstCBKIanY8/y6U0KeJNGpkJzlK1PXnsvoC+LTZ2tDFwhhV9gendvCung6NII/7wM6RMTfl8Sbf34sPtIYd727GjQ7+UDblX138576YpTxonzteIJBWm9OzSiqiawQji2+qRYhZh5cGHJcE4/5+xTfR6aJa2gEiSs= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156849882870.7982137536878; Thu, 1 May 2025 20:34:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8l-00066f-At; Thu, 01 May 2025 23:32:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8X-0005f4-Gj for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:31 -0400 Received: from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8V-0001Ln-Se for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:29 -0400 Received: by mail-pf1-x42a.google.com with SMTP id d2e1a72fcca58-7369ce5d323so1540548b3a.1 for ; Thu, 01 May 2025 20:32:27 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156746; x=1746761546; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RcPVYeeQT1GwwWrtzjsEjtZuBAgtjHa2HHwNwJdBE50=; b=VUmx/zBtCvqEwGDwLuhhCqftExFPF3YUcQA8MFe/0OoL/2P9fIX6beMG/k6Dc6Puxc A8bvcP7jQWoADgHjS4emwipgMNfQhT/bnHeCNeFjDqs+xw6hZvXp0tmn1xAFQwur+ir3 vmdVatCl9VvF0DKFk31SE1qpv2wrW9lAJYJullptQ0EGNLn+LfS0Lauc6pIequJdEo6k t85H+l3BcCf4uTM2OKZ45uUV3K6LeQEO03006BAQhX8rN4hX+A0pj4wVWkSeFa4tEcxC YaNaK7cr263aI6ttne8PAyzOtH8Pnom1Xrho/GZ+mc4sHQbkg5azNK5x+15B2GnPJK9V SCgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156746; x=1746761546; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RcPVYeeQT1GwwWrtzjsEjtZuBAgtjHa2HHwNwJdBE50=; b=Dvv0EIFUGL7Qd+6BDKHlVlf4vLRvviAMmUbUgd84VbJ493e3hXFLTvdFLeTrNsSfB9 TZHbwA/2iBiR4tc4MbmD+R9vcFTgG/BqgsC2QyUl2geI1AeAHy28sMtKjomWbLzv/JJq xXYfv6E2p6zBACXtU7wcCr2aRPcoANS1hZiOPwde3vKPNT21JSTlbfxilqWK69QYkt2W HL+fnZ/Wpuk/qV+MZxDYejycwFBhACo2E+Pcy7xOMcbfiQKADtEyHkR2ym5kJwyqhGgA Bp0y2DzZvg1pRunMQMyRIY8EH7k9oEVVnIwvpVGBT8fI09SjpWv8qdM+s4NNgfMQ6dVZ VNXw== X-Forwarded-Encrypted: i=1; AJvYcCVfTXdsHJ45+yC4O6lQDlYUhh4ENejadpYcglW6pYCX+PzillR2c2/Z4YqvP8IlysAzvGlbWXUa/Aiu@nongnu.org X-Gm-Message-State: AOJu0Yx0+3GiQ2iEWVe5P4QBUg7kMWjbn7E6rL+z+8xXQWFUpMpyGPDb pmDX68KsOVTIxqHCPqTs28QyhM7co1/WVBwt5YUTRajzljOoRLI5 X-Gm-Gg: ASbGncvRmV+m5WIgBYb8tfelRCTQ0A3rVs6zhYsZzxmlVXmI7oIrbeiUhCrLoJrXOCZ DiihuQFv1SACsI3qKu3lBFNMEFVrt6WXyyyYvHsN6XVaBlLwOADOa73chnUahp0sC6VCCKdy7Kz EIjwde1gSnQJm1DFR82p/B0sYzWy0FOle48vJiHR5WAZEcaPkuUxO7fSmu+mZ6ke/wms6tznd1u Unnhg16Hqas/8x5xGQdQt5UrYTxaxmnqD53SQbaHXEN/PzquE/eYdO/gyLPaBFKnUKeiHduQtys EhKCFtrtRY6oFMn4aw9oM6fMLqVuLxg9lrcUyj3Q4Ctg X-Google-Smtp-Source: AGHT+IGHUzCQEK2l4Q1hKUH4O18BZ5dvIKwp1u0MPThZChab+Vu/BFhbVVJTWGl2oXoUler738BCnw== X-Received: by 2002:a05:6a00:6c9b:b0:736:3979:369e with SMTP id d2e1a72fcca58-74058a1af4cmr1682748b3a.9.1746156746609; Thu, 01 May 2025 20:32:26 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 17/22] usb/msd: Add some additional assertions Date: Fri, 2 May 2025 13:30:41 +1000 Message-ID: <20250502033047.102465-18-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42a; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42a.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156851492019100 Add more assertions to help verify internal logic. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Nicholas Piggin --- hw/usb/dev-storage.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 66fffda3713..81bfdf08992 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -271,13 +271,24 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t= len) MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p =3D s->data_packet; =20 - if ((s->mode =3D=3D USB_MSDM_DATAOUT) !=3D (req->cmd.mode =3D=3D SCSI_= XFER_TO_DEV)) { - usb_msd_fatal_error(s); - return; + if (s->mode =3D=3D USB_MSDM_DATAIN) { + if (req->cmd.mode =3D=3D SCSI_XFER_TO_DEV) { + usb_msd_fatal_error(s); + return; + } + } else if (s->mode =3D=3D USB_MSDM_DATAOUT) { + if (req->cmd.mode !=3D SCSI_XFER_TO_DEV) { + usb_msd_fatal_error(s); + return; + } + } else { + g_assert_not_reached(); } =20 + assert(s->scsi_len =3D=3D 0); s->scsi_len =3D len; s->scsi_off =3D 0; + if (p) { usb_msd_copy_data(s, p); p =3D s->data_packet; @@ -295,6 +306,10 @@ void usb_msd_command_complete(SCSIRequest *req, size_t= resid) =20 trace_usb_msd_cmd_complete(req->status, req->tag); =20 + g_assert(s->req); + /* The CBW is what starts the SCSI request */ + g_assert(s->mode !=3D USB_MSDM_CBW); + s->csw.sig =3D cpu_to_le32(0x53425355); s->csw.tag =3D cpu_to_le32(req->tag); s->csw.residue =3D cpu_to_le32(s->data_len); @@ -493,7 +508,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, cbw.cmd_len, s->data_len); assert(le32_to_cpu(s->csw.residue) =3D=3D 0); - s->scsi_len =3D 0; + assert(s->scsi_len =3D=3D 0); s->req =3D scsi_req_new(scsi_dev, tag, cbw.lun, cbw.cmd, cbw.cmd_len, NULL); if (s->commandlog) { --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156814; cv=none; d=zohomail.com; s=zohoarc; b=YKCwR/Qjr/FhwF4wFn3cQWn0Ll1Uyy628v7OE8VXbvDPDwHPcK2UIJC2sGP3HqXEJVr+NOUaSVUNZPadAXYK+KjWNszw27kp4podH6CjcOcXjtElSGAlvBRy749f1djTVQy24DNyTDvjYmz0UarC6C74SdMA3WnBn2X5eAnID34= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156814; 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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rCpaksK2rzu3/LnJzfXlQ4odbcCWyWpTcklgGK0MoZU=; b=OX4XWCzvWySCeu6HpdcDBnIsX77AjYcZUDc0DCJpdANt3oXzosV4C5+q0rVzxueoH0I9QyKG5MTzQ2Go7gG5CJQ7rqICEhJng5orDW3hhvTujhOkSJJfMEo+4QSwvCPRco0TRyMeh8yRM2XzF8hif29GnYpXrL7Ddm9hWoCH54w= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156814250572.9406342240836; Thu, 1 May 2025 20:33:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8o-0006Ks-8o; Thu, 01 May 2025 23:32:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8e-0005ly-0a for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:37 -0400 Received: from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8c-0001M0-3c for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:35 -0400 Received: by mail-pf1-x42a.google.com with SMTP id d2e1a72fcca58-736b98acaadso1605189b3a.1 for ; Thu, 01 May 2025 20:32:32 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156752; x=1746761552; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rCpaksK2rzu3/LnJzfXlQ4odbcCWyWpTcklgGK0MoZU=; b=DtxpL1Fu62wXk+C4grmrXTk7nO9wLf760Nv+QLtmrRzb9uSltPumhG4t0mJmHad2St TWOSKCZPL7T2Kx1opIZsi3y9Vne2QgTdjJTd4PEz7jFWFrAYvnH9XFT9cL6tZ1qhVqv2 y3tnhQeIi34qlcbGcDIhzfjwdYz/RcqCkhXmhHU8CqZ8aVAWSN+cm449ZowWWaDw7Tv+ IZ6/wHkaVapfBfJHssy+QmXjmXIGFRTXYIb+2rU/U/+fwUd1iKa5BbhlYWVk/Igo+QgL s1N87oBkBI4yd/knrlfVkXhMg9OBfivDmAfTnYnOprM/nmq7A9+EryPYPql6T/+2i0CG IuVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156752; x=1746761552; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rCpaksK2rzu3/LnJzfXlQ4odbcCWyWpTcklgGK0MoZU=; b=eUqRN+BLgb6VbTXODYzHCHHs/gf9xbUFE7iPO0Lyp3jVdzEWWBau3Klv7a9Uua7cIG iJAv25G7HBclO0yL2Z3bvMeTVqJhQ0cH3hpE5awXADazZUxqDasuwFjD70IFUD0ZoYAB Wi9+tc6WpTx+G3nLfCbql0YQGgm88oVlE9TDzhYBOfTtBWs9eFhwfjvG56V3mZcDCBQF qwZl74rBwM/7fSKTQX31Wy7WdVp3UoVYRgfnBB49A8x0k4CYUxeKLYnRNyhJ0PIXUFM/ KKsxDKXoM0CBnTvx2OblqIDu+/B7vO4b0ehw2sPcOXOpUvWXvU+Wi/3AIQQDRK3klNsx Na/Q== X-Forwarded-Encrypted: i=1; AJvYcCUiC6emr7z0vI+Oj5Xyj/Nxm0o5LVYQHC8b5oYuhZyRQIdBLTipPrtIZpVLaJlsmBTUvLsLzGoAEsQM@nongnu.org X-Gm-Message-State: AOJu0YxDD9qdEpLqoi65dX1aMdbmVwVLCuiYeeGRQFXY/fpS6fS+XdP7 qgH9bV7+2M5QxgHOjGrqMMmV/cabDo3hvNXGMXbIaHFGrcqOjKnHmrrFLw== X-Gm-Gg: ASbGnctao5MBhjFFk9+nDZCcMgkjFKy9pXuW1c0sOSjO1+KT11exNQsVaTWTDRiLNeH yXJp7tb7I6bWPTK2eKDGz1UkG/c0dnlfQ2dk+hUO0702NouLgjYpYQRwOT8URZRgkkpzDiD/cHo 4mQTM2OcDX4ej0dcc/IFV3zD/o6bU2FtjDS1nIutoDTDcfNSVaEKRFpLjils9/nUN3DNa2Bt6uN NE8r1KsERUxMUi/D5zpwWE5xCzk1nMj/BIaOGbhmL2571yaaJR3UNWgcRXVsI/KWSaTAUVvDTbe IahSFQxugsnfrVCq7sS9d6wn6mk14+pJoomQppCVR5Ol X-Google-Smtp-Source: AGHT+IGs5vssIE+1umDaLVUZpeZZ1yW8JNe9lZuwH4x7fAn02XIGFiw97Ml2hjYH5lYkqbKIAGtyiw== X-Received: by 2002:a05:6a00:4143:b0:736:755b:8317 with SMTP id d2e1a72fcca58-74058b345d5mr1937524b3a.21.1746156751769; Thu, 01 May 2025 20:32:31 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 18/22] usb/msd: Rename mode to cbw_state, and tweak names Date: Fri, 2 May 2025 13:30:42 +1000 Message-ID: <20250502033047.102465-19-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42a; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42a.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156815518019100 This reflects a little better what it does, particularly with a subsequent change to relax the order packets are seen in. This field is not the general state of the MSD state machine, rather it follows packets that are completed as part of a CBW command. The difference is a bit subtle, so for a concrete example, the next change will permit the host to send a CSW packet before it sends the associated CBW packet. In that case the CSW packet will be tracked and the MSD state machine will move, but this mode / cbw_state field would remain unchanged (in the "expecting CBW" state), until the CBW packet arrives. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Nicholas Piggin --- include/hw/usb/msd.h | 14 ++++++------- hw/usb/dev-storage.c | 50 +++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/include/hw/usb/msd.h b/include/hw/usb/msd.h index a40d15f5def..af12a16c35f 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -10,12 +10,12 @@ #include "hw/usb.h" #include "hw/scsi/scsi.h" =20 -enum USBMSDMode { - USB_MSDM_CBW, /* Command Block. */ - USB_MSDM_DATAOUT, /* Transfer data to device. */ - USB_MSDM_DATAIN, /* Transfer data from device. */ - USB_MSDM_CSW /* Command Status. */ -}; +typedef enum USBMSDCBWState { + USB_MSD_CBW_NONE, /* Ready, waiting for CBW packet. */ + USB_MSD_CBW_DATAOUT, /* Expecting DATA-OUT (to device) packet */ + USB_MSD_CBW_DATAIN, /* Expecting DATA-IN (from device) packet */ + USB_MSD_CBW_CSW /* No more data, expecting CSW packet. */ +} USBMSDCBWState; =20 struct QEMU_PACKED usb_msd_csw { uint32_t sig; @@ -26,7 +26,7 @@ struct QEMU_PACKED usb_msd_csw { =20 struct MSDState { USBDevice dev; - enum USBMSDMode mode; + USBMSDCBWState cbw_state; uint32_t scsi_off; uint32_t scsi_len; uint32_t data_len; diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 81bfdf08992..5b773a22e60 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -271,12 +271,12 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t= len) MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p =3D s->data_packet; =20 - if (s->mode =3D=3D USB_MSDM_DATAIN) { + if (s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { if (req->cmd.mode =3D=3D SCSI_XFER_TO_DEV) { usb_msd_fatal_error(s); return; } - } else if (s->mode =3D=3D USB_MSDM_DATAOUT) { + } else if (s->cbw_state =3D=3D USB_MSD_CBW_DATAOUT) { if (req->cmd.mode !=3D SCSI_XFER_TO_DEV) { usb_msd_fatal_error(s); return; @@ -308,7 +308,7 @@ void usb_msd_command_complete(SCSIRequest *req, size_t = resid) =20 g_assert(s->req); /* The CBW is what starts the SCSI request */ - g_assert(s->mode !=3D USB_MSDM_CBW); + g_assert(s->cbw_state !=3D USB_MSD_CBW_NONE); =20 s->csw.sig =3D cpu_to_le32(0x53425355); s->csw.tag =3D cpu_to_le32(req->tag); @@ -319,7 +319,8 @@ void usb_msd_command_complete(SCSIRequest *req, size_t = resid) s->req =3D NULL; =20 if (p) { - g_assert(s->mode =3D=3D USB_MSDM_DATAIN || s->mode =3D=3D USB_MSDM= _DATAOUT); + g_assert(s->cbw_state =3D=3D USB_MSD_CBW_DATAIN || + s->cbw_state =3D=3D USB_MSD_CBW_DATAOUT); if (s->data_len) { int len =3D (p->iov.size - p->actual_length); usb_packet_skip(p, len); @@ -329,19 +330,19 @@ void usb_msd_command_complete(SCSIRequest *req, size_= t resid) s->data_len -=3D len; } if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_data_packet_complete(s, USB_RET_SUCCESS); } else if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } =20 - if (s->mode =3D=3D USB_MSDM_CSW) { + if (s->cbw_state =3D=3D USB_MSD_CBW_CSW) { p =3D s->csw_in_packet; if (p) { usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; + s->cbw_state =3D USB_MSD_CBW_NONE; /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_csw_packet_complete(s, USB_RET_SUCCESS); } @@ -384,7 +385,7 @@ void usb_msd_handle_reset(USBDevice *dev) } =20 memset(&s->csw, 0, sizeof(s->csw)); - s->mode =3D USB_MSDM_CBW; + s->cbw_state =3D USB_MSD_CBW_NONE; =20 s->needs_reset =3D false; } @@ -485,8 +486,8 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) SCSIDevice *scsi_dev; int len; =20 - switch (s->mode) { - case USB_MSDM_CBW: + switch (s->cbw_state) { + case USB_MSD_CBW_NONE: if (!try_get_valid_cbw(p, &cbw)) { goto fail; } @@ -499,11 +500,11 @@ static void usb_msd_handle_data_out(USBDevice *dev, U= SBPacket *p) tag =3D le32_to_cpu(cbw.tag); s->data_len =3D le32_to_cpu(cbw.data_len); if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } else if (cbw.flags & 0x80) { - s->mode =3D USB_MSDM_DATAIN; + s->cbw_state =3D USB_MSD_CBW_DATAIN; } else { - s->mode =3D USB_MSDM_DATAOUT; + s->cbw_state =3D USB_MSD_CBW_DATAOUT; } trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, cbw.cmd_len, s->data_len); @@ -520,7 +521,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) } break; =20 - case USB_MSDM_DATAOUT: + case USB_MSD_CBW_DATAOUT: trace_usb_msd_data_out(p->iov.size, s->data_len); if (p->iov.size > s->data_len) { goto fail; @@ -538,7 +539,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) } s->data_len -=3D len; if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } } } @@ -563,8 +564,8 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) MSDState *s =3D (MSDState *)dev; int len; =20 - switch (s->mode) { - case USB_MSDM_DATAOUT: + switch (s->cbw_state) { + case USB_MSD_CBW_DATAOUT: if (!check_valid_csw(p)) { goto fail; } @@ -580,7 +581,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) p->status =3D USB_RET_ASYNC; break; =20 - case USB_MSDM_CSW: + case USB_MSD_CBW_CSW: if (!check_valid_csw(p)) { goto fail; } @@ -592,11 +593,11 @@ static void usb_msd_handle_data_in(USBDevice *dev, US= BPacket *p) p->status =3D USB_RET_ASYNC; } else { usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; + s->cbw_state =3D USB_MSD_CBW_NONE; } break; =20 - case USB_MSDM_DATAIN: + case USB_MSD_CBW_DATAIN: trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); if (s->scsi_len) { usb_msd_copy_data(s, p); @@ -610,11 +611,12 @@ static void usb_msd_handle_data_in(USBDevice *dev, US= BPacket *p) } s->data_len -=3D len; if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } } } - if (p->actual_length < p->iov.size && s->mode =3D=3D USB_MSDM_DATA= IN) { + if (p->actual_length < p->iov.size && + s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { trace_usb_msd_packet_async(); s->data_packet =3D p; p->status =3D USB_RET_ASYNC; @@ -679,7 +681,7 @@ static const VMStateDescription vmstate_usb_msd =3D { .minimum_version_id =3D 1, .fields =3D (const VMStateField[]) { VMSTATE_USB_DEVICE(dev, MSDState), - VMSTATE_UINT32(mode, MSDState), + VMSTATE_UINT32(cbw_state, MSDState), VMSTATE_UINT32(scsi_len, MSDState), VMSTATE_UINT32(scsi_off, MSDState), VMSTATE_UINT32(data_len, MSDState), --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156872; cv=none; d=zohomail.com; s=zohoarc; b=QHfRIKbTQUavXj02f668xY1J28hng2BLYwFkQIhlwhRAgaa88sOvPxB4+0jG460wWVR8I92TgZD3CJU6pSyjOjWCh4YSWIbUXKqxFdl08tDtTbIEG74yiq7IMLJhO6mWuOQhRHk/fyN+IR7QrmksdGUlAxFSZzxBiBrMXxDro3M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156872; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=YxKI7f7n6Tn3V37ypD9JbP6M9PyWm2G5CMuSlKC7xw4=; b=Eo4iikGLxJrqkDuWMHj/V2+LRMqhMfVn++9KfDzhqdl12fb2D9weoYrrvIZjloC8bqPIgHKx9RmzLhQ7xZaCXRHHqL4GMAi0qIrjn3NE8APHe6mmuthAtKVy0DkCRVa92DI9JUVTIKTL62QGUTxLMLWDQ6htCUSUpHzYS/5ieuM= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 174615687280149.698603969301644; Thu, 1 May 2025 20:34:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8l-0006CK-WA; Thu, 01 May 2025 23:32:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8i-0005sf-Ee for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:40 -0400 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8g-0001Mm-PG for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:40 -0400 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-7376e311086so2404622b3a.3 for ; Thu, 01 May 2025 20:32:37 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156757; x=1746761557; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YxKI7f7n6Tn3V37ypD9JbP6M9PyWm2G5CMuSlKC7xw4=; b=G4ab7GIrAWdN0pGZPOUmhbrUk7wZh2/LhozVniGMUoXXHCqSdHlnXKCiQO2vCkTAk4 39+qjdzbYjbV6/ug4LG90X+GXKfTcybityX2PWMRyrQ3ebSeaW2EW6GwSGaumEAcI63M 6eT/be02L4K2WROiBGX+TMRawuEh6z5HndM6whZVdVf6l/3uMIIj0PDHIkdj1W/DTkae DjWhGmHF+PUIJA3HLeE3WpnJq0JHYLmQjQd/wiwpP7OnDzzmz3xvJmkhvzy04Xvqg5pY 8+/jzRHnjE5Ajiw1joddXy7jqLKmu8Y5wfzPzCSLTv/451lvj/rrOj8l7P1mxdeoORd7 7I9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156757; x=1746761557; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YxKI7f7n6Tn3V37ypD9JbP6M9PyWm2G5CMuSlKC7xw4=; b=WuLs5SaXxp+JeEFyCoKR1zN8OoNlJIeVSTmCocUAItJfcOkojV9xeL1GqgC6LRavj8 1XnrmapFXiQmH+lmtD5rfzqiFvUqZaPvMVFo+9ELnKtc4s3lBSeSiA5z65kS/fgSdOY/ lfRLlO6rBMBqBve5aDoXvUQ6vKK178w0DZ6U5hajfiwkoMdcmNGRUNbSRVhrgdZmaHJ9 O87f9y009Ci+eDDu7RWKia12wzJLoXwYEah52yEHNcAQWwOpyInHNd3OL3VEMUdaYNBX jRIJXe2daEgx42QHH9ynLmPia7u/s8qZpSTd1DWst62IP/LqcUA0eiRv/pC99XojbkYP rcDA== X-Forwarded-Encrypted: i=1; AJvYcCWD0RwrCeyN+UP9AxAMrpwZZBD2El20aSq3lJTMIE5JwU4MXB16W3lupMn+ki3wEU2qslP1M9WSD1Hb@nongnu.org X-Gm-Message-State: AOJu0YwFbUGfCiL6tufHDOJelaabT2wKo0TW/hIJOloqX51bdKQ3G2xn q9DGdCaoTXERrgwOyDDJ4YTFKWQ6aEiAyF+bPQGFRdYsuPiy9SjIckQ02Q== X-Gm-Gg: ASbGncuiNhN0T3c4mKptDG9cNz+ltxHPTvnKutKMJWHNVkApPSLoXOrDQp9VbR4Vim5 hSR56BPSDzcOWEyzhVTfRU5zTyvcyFOiv8C8pcL+WrVHtp+oUGj2CONEEohTk6JiSh+CzXXXq+s Br4VOIHuH4HOpcw6lWV1dtFgnkgv+QJocS8vo5dIvoYJStPOFmn/CqtACJDbCue2VGXMu47eKwA xbrjKIwGvZRTwNnMKYAZdEqGwCg/xml0fiu5LLQzWxAc+vxibP9/pqBgGQLEbmzP0B25eLC42sA LL7jOTRBP3HoK+xG0/yZ7v776Ncw8Rk2/VcLh+WWtjtq X-Google-Smtp-Source: AGHT+IH0qGvgnU1xlbGGqs/qU5TPUsMyLEDvYa33Zz7PmTp5Q8F+izP2Y/elpmXpwRTy1s/yWkxW9w== X-Received: by 2002:a05:6a00:6ca1:b0:737:678d:fb66 with SMTP id d2e1a72fcca58-740589049edmr2032846b3a.5.1746156757127; Thu, 01 May 2025 20:32:37 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 19/22] usb/msd: Add NODATA CBW state Date: Fri, 2 May 2025 13:30:43 +1000 Message-ID: <20250502033047.102465-20-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::431; envelope-from=npiggin@gmail.com; helo=mail-pf1-x431.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156876179124100 Content-Type: text/plain; charset="utf-8" This is not really required for the state machine but it improves the symmetry of zero-data packets with data packets, and helps with assertions and reasoning about traces. Signed-off-by: Nicholas Piggin --- include/hw/usb/msd.h | 1 + hw/usb/dev-storage.c | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/hw/usb/msd.h b/include/hw/usb/msd.h index af12a16c35f..6d741e44160 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -14,6 +14,7 @@ typedef enum USBMSDCBWState { USB_MSD_CBW_NONE, /* Ready, waiting for CBW packet. */ USB_MSD_CBW_DATAOUT, /* Expecting DATA-OUT (to device) packet */ USB_MSD_CBW_DATAIN, /* Expecting DATA-IN (from device) packet */ + USB_MSD_CBW_NODATA, /* No data, CSW but also a SCSI completion */ USB_MSD_CBW_CSW /* No more data, expecting CSW packet. */ } USBMSDCBWState; =20 diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 5b773a22e60..a2544d2659f 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -318,9 +318,12 @@ void usb_msd_command_complete(SCSIRequest *req, size_t= resid) scsi_req_unref(req); s->req =3D NULL; =20 + g_assert(s->cbw_state =3D=3D USB_MSD_CBW_DATAIN || + s->cbw_state =3D=3D USB_MSD_CBW_DATAOUT || + s->cbw_state =3D=3D USB_MSD_CBW_NODATA); + if (p) { - g_assert(s->cbw_state =3D=3D USB_MSD_CBW_DATAIN || - s->cbw_state =3D=3D USB_MSD_CBW_DATAOUT); + g_assert(s->cbw_state !=3D USB_MSD_CBW_NODATA); if (s->data_len) { int len =3D (p->iov.size - p->actual_length); usb_packet_skip(p, len); @@ -500,7 +503,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) tag =3D le32_to_cpu(cbw.tag); s->data_len =3D le32_to_cpu(cbw.data_len); if (s->data_len =3D=3D 0) { - s->cbw_state =3D USB_MSD_CBW_CSW; + s->cbw_state =3D USB_MSD_CBW_NODATA; } else if (cbw.flags & 0x80) { s->cbw_state =3D USB_MSD_CBW_DATAIN; } else { @@ -565,6 +568,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) int len; =20 switch (s->cbw_state) { + case USB_MSD_CBW_NODATA: case USB_MSD_CBW_DATAOUT: if (!check_valid_csw(p)) { goto fail; --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156947; cv=none; d=zohomail.com; s=zohoarc; b=gyMGg6raeLB/oXyoW2KB24te8NzQYyQz9s5ImEr7KisMBzJ1I95OIu3kCXBQ68/ytvYxiWp630er+hELQ7sdFPLS7wXyteqbk/SA2eeuTedut1IrwnsRwZy2e/ZBFjR7itZqBDTHcUhjsGbPTjiOeeTegK0Oe3FSdGbli2juze0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156947; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OgXoXzj59TwaPm6vHRzhm06dyz3oz8jlzR9jWrrlQMs=; b=JUdGaAZXhB2+Ui+nnbf24kcSFiE60aoR6R45aIRpdlly7XLgq5XOlCldiNurqpOyo+MQR95UlGyCKABa49civ5LWlU7dLbpU2rBylCB3Tfem0ZKfPGd8XXVBN5GZAt+Nx0uz3WioLblGD/q0TY6qsXxAWReYPanXWJjLH3rFQ2I= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156947420787.3433320776733; Thu, 1 May 2025 20:35:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8r-0006Vj-0g; Thu, 01 May 2025 23:32:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8n-0006JH-G8 for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:45 -0400 Received: from mail-pf1-x430.google.com ([2607:f8b0:4864:20::430]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8l-0001NN-JZ for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:45 -0400 Received: by mail-pf1-x430.google.com with SMTP id d2e1a72fcca58-73bf5aa95e7so1561517b3a.1 for ; Thu, 01 May 2025 20:32:43 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156762; x=1746761562; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OgXoXzj59TwaPm6vHRzhm06dyz3oz8jlzR9jWrrlQMs=; b=NvXcpX9teJZhOMILHHKVUACo8HMupwW0bjrCqVc5z9IV9HyAVi0/O13X3w+/11k2xS vqSDSL6Cwd7FhpiPbIz0FEU7VhTZ1SSDEh3JybqiTmV853FVXkarhXgHbz/er4PoPlx+ 3RWeBzHmnyRTkCdUYdncZou/ybq1m2d8gbyZHZ6GDN3opHmAEXB0msTnwZueljrVM61c z/QuP7ZEjk1//mUDHJHz9z+kQxqLHJcLWzx/sIrZVZniEHGkUuoeNE1cQq8FlyCen1YE wTV4I5j0mPlv3aEtE/0zxzAq9wYxK86+vQEeBV5y2HtzU0EJQ3zTTvxxWCn3NcePegnd zfwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156762; x=1746761562; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OgXoXzj59TwaPm6vHRzhm06dyz3oz8jlzR9jWrrlQMs=; b=ILgWYyK+9ThcLkc/FIhxGDrznmXd28vtKfiWq7p0/jdw7L6MubJNxh1YvmuumshDSP MWs0db4RTCYKzRF0Xgo8oeapA9ORvx+IY4oAgzJdqXGzwfV6DQyncCy94/0ioT+6dnxw RwnSaLR+ry4aeWSXp1Wez3l9SHjmTFhJKFkvjvJjvB/ULZdNd9BGdpBUQU8AiFEL66MH OOZ4725O6B9T0USosc3gLM9uV30xX6n6Q3X1bw1Sy2tk9khInlHwPFenMfQnul7SAPWH dxqDNfX5pjymKdejUq1rE/5F3ZIYM1vfDdIp1hHhRFPAEge8JZHQ3Z/1tYPUnJteh1e4 V7hQ== X-Forwarded-Encrypted: i=1; AJvYcCVjjIq2h5TqamoXeENtcq2x0/8G2pbdPoNz5R9cg8h8xS0F9NUfguzrrJPXYINVtLEXVzn3AvK9M0YS@nongnu.org X-Gm-Message-State: AOJu0YzfjNmA/Q6l+UTHaGCoxUfa3lLHo/722nU8ydaZJetST41SDjzb DNV+itIVHhBqxzXkLd02GubqFAcafmjI3PRN7KTj1tRJ7FeGf3TF X-Gm-Gg: ASbGncvwfKHHwv9pFgL42twFaE2nB5uPLhuCeny3seITtiy/qJaFQqadv6KEYY32lrf zUskMy74A12a0t04b7KV9MJA8vjGm4EuVZ1aKD5UI6Vsl3OdiiNzM8E2erHDLSC+rcFSccuNmio I59vAqoahbw/1llyw04OsM0lY/6rW6jKcrde9JU0L41JPd6Sm42PZVJbc+YxLKgpQB1C/OdEqoa RsDail3tGUoGwYz2JCo4ZJx3zWRMfVJCcUVyU9gcBxjGCqCdljg/JkVkT7JUlg35Urs05J0XDcS 5g48fE7VXjdqPNZdp50zqMmmcvUSwvFKvXGcYCbA+0KQ X-Google-Smtp-Source: AGHT+IE+2/BvVzof1F56X0mn7RzFWp6KPhNSFiqQLEue2wI/t5R941+LlCAjG1tDnJfeGThz4bzIjA== X-Received: by 2002:a05:6a21:b8a:b0:1d9:c615:d1e6 with SMTP id adf61e73a8af0-20cdc1ec1d6mr2004234637.0.1746156762219; Thu, 01 May 2025 20:32:42 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 20/22] usb/msd: Permit a DATA-IN or CSW packet before CBW packet Date: Fri, 2 May 2025 13:30:44 +1000 Message-ID: <20250502033047.102465-21-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::430; envelope-from=npiggin@gmail.com; helo=mail-pf1-x430.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156973792124100 Content-Type: text/plain; charset="utf-8" The USB MSD protocol has 3 packets that make up a command, and only one command may be active at any time. - CBW to start a command (that contains a SCSI request). - DATA (IN or OUT) to request data transfer between host and SCSI layer. - CSW to return status and complete the command. DATA is omitted if the request has no data. The QEMU MSD model requires these packets to arrive in this order, CBW, DATA, CSW. This is the way the state machine is generally described in the MSD spec, and this must be how most USB stacks operate. Except AIX. Universal Serial Bus Mass Storage Class Bulk-Only Transport 1.0 contains one word in one sentence that permits the relaxed ordering: 3.3 Host/Device Packet Transfer Order The host shall send the CBW before the associated Data-Out, and the device shall send Data-In after the associated CBW and before the associated CSW. The host may request Data-In or CSW before sending the associated CBW. Complicating matters, DATA-IN and CSW are both input packets that arrive in the same manner, so before a CBW it is impossible to determine if an IN packet is for data or CSW. So permit "unusually-ordered" packets by tracking them as an "unknown" packet until the CBW arrives, then they are categorized into a DATA or CSW packet. It is not clear whether the spec permits multiple such packets before the CBW. This implementation permits only one, which seems to be enough for AIX. Signed-off-by: Nicholas Piggin --- include/hw/usb/msd.h | 1 + hw/usb/dev-storage.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/hw/usb/msd.h b/include/hw/usb/msd.h index 6d741e44160..fb430f87afc 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -38,6 +38,7 @@ struct MSDState { /* For async completion. */ USBPacket *data_packet; USBPacket *csw_in_packet; + USBPacket *unknown_in_packet; =20 /* usb-storage only */ BlockConf conf; diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index a2544d2659f..f421bd1f8dd 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -446,6 +446,8 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPacket= *p) } } else if (p =3D=3D s->csw_in_packet) { s->csw_in_packet =3D NULL; + } else if (p =3D=3D s->unknown_in_packet) { + s->unknown_in_packet =3D NULL; } else { g_assert_not_reached(); } @@ -509,6 +511,19 @@ static void usb_msd_handle_data_out(USBDevice *dev, US= BPacket *p) } else { s->cbw_state =3D USB_MSD_CBW_DATAOUT; } + if (s->unknown_in_packet) { + if (s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { + /* Must be a DATAIN packet */ + s->data_packet =3D s->unknown_in_packet; + } else { + /* Must be the CSW packet */ + if (!check_valid_csw(s->unknown_in_packet)) { + goto fail; + } + s->csw_in_packet =3D s->unknown_in_packet; + } + s->unknown_in_packet =3D NULL; + } trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, cbw.cmd_len, s->data_len); assert(le32_to_cpu(s->csw.residue) =3D=3D 0); @@ -526,6 +541,11 @@ static void usb_msd_handle_data_out(USBDevice *dev, US= BPacket *p) =20 case USB_MSD_CBW_DATAOUT: trace_usb_msd_data_out(p->iov.size, s->data_len); + if (s->unknown_in_packet) { + error_report("usb-msd: unknown_in_packet in DATAOUT state"); + goto fail; + } + if (p->iov.size > s->data_len) { goto fail; } @@ -568,8 +588,23 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) int len; =20 switch (s->cbw_state) { + case USB_MSD_CBW_NONE: + if (s->unknown_in_packet) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: second IN packet was" + "received before CBW\n"); + goto fail; + } + trace_usb_msd_packet_async(); + s->unknown_in_packet =3D p; + p->status =3D USB_RET_ASYNC; + break; + case USB_MSD_CBW_NODATA: case USB_MSD_CBW_DATAOUT: + if (s->unknown_in_packet) { + error_report("usb-msd: unknown_in_packet in DATAOUT state"); + goto fail; + } if (!check_valid_csw(p)) { goto fail; } @@ -586,6 +621,10 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) break; =20 case USB_MSD_CBW_CSW: + if (s->unknown_in_packet) { + error_report("usb-msd: unknown_in_packet in CSW state"); + goto fail; + } if (!check_valid_csw(p)) { goto fail; } @@ -603,6 +642,10 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) =20 case USB_MSD_CBW_DATAIN: trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); + if (s->unknown_in_packet) { + error_report("usb-msd: unknown_in_packet in DATAIN state"); + goto fail; + } if (s->scsi_len) { usb_msd_copy_data(s, p); } --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156924; cv=none; d=zohomail.com; s=zohoarc; b=HOGg1XnUhRJL9HpGL3HyYvcKRr2S/9MIa9BZAEeldeUJUSpUvX3ZUZDBLM8huuhYEsXgaiPY63oR2hrFlUdcm98XFzIDmXP9NLgcebQI1b12ZmVvHljA5ulO3sS3FkgvcqiFgitwLHe0zdenKrAv2dnsAyEy6hhS1SAMHtI/FS0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156924; h=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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=jOGwADERVvXg781RmsL0xZJHu1Zpu23r1/TsBfdql40=; b=kSM1Q5hsiOztj/ucMf0Wk7Zmm8HYDkhgb15NxpMW2IeKkqsL4JSwjXgcMczUk4bGiGaxBuh3EwuLilbu1UpTxlPLTm+UPkuhfYHxIiP2HVU0p9ztwKIDzo59Pfk4x5yAEfodeCjNDmKqHNphyVeouVhE6862EzRSfv1pbI7kn+w= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1746156924961655.7430272041752; Thu, 1 May 2025 20:35:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh8v-0006xq-WC; Thu, 01 May 2025 23:32:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh8s-0006do-Qk for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:51 -0400 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh8q-0001O2-OK for qemu-devel@nongnu.org; Thu, 01 May 2025 23:32:50 -0400 Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-72d3b48d2ffso1848785b3a.2 for ; Thu, 01 May 2025 20:32:48 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156767; x=1746761567; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jOGwADERVvXg781RmsL0xZJHu1Zpu23r1/TsBfdql40=; b=RUrN3DqHJ0mUNqRdkeGeClpcssCTgGdltB2Sz5lyJxV8hecQRTTl+zfXsSZc2UVpYa k0XBGMIcNOTa5zAKzN9i64vU4KboH1VwCC8lZNPzrb9BfO+2Qf/OaW6sMxfLhMT0JK5E 0AUa15GZnnpRmyqwpq9nbrdQbv5jSp7rJrWsOrS1QFAkROXLrRe6YHJ2UWYBK63aHiud +F+ew1DgxpXSmw8F0Dt3Q49jf4JVB8mQAHxSD0KmxmDjnUfcPT1/dWB3U9nH8SzgdjXQ Mck2kPA5Bsosq4nhV2qW5M3pZfwttiDDV1RMvMe8KybqBL4b79jSGWd+S22ix3ZwW0dZ 3xTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156767; x=1746761567; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jOGwADERVvXg781RmsL0xZJHu1Zpu23r1/TsBfdql40=; b=gKNvGpvIF9Le505Rdx2WOEOdSt1Usf1lzS0oMxQGk8nbIyc+gzbnG3mysjR7NUpV1m 3vpV2WUUh6d7pUCbSsSbsjMrfTxX0mQMv2nTQCgh4YGy1X6TL0bcHCfqLEyT98M+rx0P IsLHd9PMWwbJ3jD5WWqChvKrmwHE85c/kJR3QFIuu8cqswDBCNNTEl1NbxnKaypGw0hI Ts2zF8v6JG13hEC4crfvKccl8J8QTDJ/ruMdzkRQTTDOJ7bLM07DDHPRYshL1VT1u24z fWASa0eIt1qXSf2Q2XcLHFLTMdJFtQkyLlR4WwihVWCvKP6KxIYHZ+A+7EUXdKUMsiVE 013w== X-Forwarded-Encrypted: i=1; AJvYcCWQ5IdF52z/5+MTnGhnI5NTxh5GZ62sfMPQCTGsUdUrQB9LhjLM/QehTj2kkCWiHSUhlpGwpt9d/kkf@nongnu.org X-Gm-Message-State: AOJu0Yxg35/nMAiRs9QPTcz5NrO77FgqY91MypdQ5IebKdteMhdfXeZH K7bUXcyjgzAPLW33Br0MkqYUbX0yPc33XTXVoqVJpdsTslP+pNYb X-Gm-Gg: ASbGncuexcZ3ocvKoopStr0yRwa9xCJFTGhLK4SLQinpyGOv9dCIEh3/aU/DpJdX9O3 Q4LyL+GV5TS6M7bHhMAikZlFerKNpo1I/8h/qfQYQNUh35X+vpwfeqrip4Uj8NEpNDmIw4ABjdR Gr50D6u6Ck5jkE77ZczYHkizqHGeceQAa3tgBT/mz7Z+y5JeH3NvfjfEmcsSQssQwTK0h945c+M lUgHuvuo8janxYw4iYiUAgI86K8TB4+H9C0vrNTTSRDXoqB4nrX0eAwE2JWvv9d0qo8q7fgfzJM 487+/HaO3hK9QBKEKdguK3tl+wfpnN0VisWAC3VP+wy3 X-Google-Smtp-Source: AGHT+IFvRJI7Dh6/uFThU+y/se4og3amgMJ02k4Btom5a+oiHKKxDXy7jaR8pGRixJFOzwFdNLPZmw== X-Received: by 2002:a05:6a20:7d9e:b0:1fd:f4df:9a89 with SMTP id adf61e73a8af0-20cded435edmr1793021637.25.1746156767391; Thu, 01 May 2025 20:32:47 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 21/22] tests/qtest/xhci: Test USB Mass Storage relaxed CSW order Date: Fri, 2 May 2025 13:30:45 +1000 Message-ID: <20250502033047.102465-22-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42d; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42d.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156925971019100 Content-Type: text/plain; charset="utf-8" This adds a qtest for the improvement to the MSD protocol that allows an IN packet before the CBW packet. Send a CSW packet before a zero-length CBW command packet is sent. This test would fail with the MSD change reverted. Signed-off-by: Nicholas Piggin Reviewed-by: Fabiano Rosas --- tests/qtest/usb-hcd-xhci-test.c | 180 ++++++++++++++++++++++++++++---- 1 file changed, 158 insertions(+), 22 deletions(-) diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index 428200d9e41..740e9cd3815 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -287,11 +287,48 @@ static bool xhci_test_isr(XHCIQState *s) s->guest_msix_addr, s->msix_data); } =20 -static void wait_event_trb(XHCIQState *s, XHCITRB *trb) +static bool check_event_trb(XHCIQState *s, XHCITRB *trb) { + XHCIQTRState *tr =3D &s->event_ring; + uint64_t er_addr =3D tr->addr + tr->trb_idx * TRB_SIZE; XHCITRB t; + + qtest_memread(s->parent->qts, er_addr, &t, TRB_SIZE); + trb->parameter =3D le64_to_cpu(t.parameter); + trb->status =3D le32_to_cpu(t.status); + trb->control =3D le32_to_cpu(t.control); + + return ((trb->control & TRB_C) =3D=3D tr->trb_c); +} + +static void consume_event(XHCIQState *s) +{ XHCIQTRState *tr =3D &s->event_ring; uint64_t er_addr =3D tr->addr + tr->trb_idx * TRB_SIZE; + + tr->trb_idx++; + if (tr->trb_idx =3D=3D tr->trb_entries) { + tr->trb_idx =3D 0; + tr->trb_c ^=3D 1; + } + /* Update ERDP to processed TRB addr and EHB bit, which clears EHB */ + er_addr =3D tr->addr + tr->trb_idx * TRB_SIZE; + xhci_intr_writel(s, 0, XHCI_INTR_REG_ERDP_LO, + (er_addr & 0xffffffff) | XHCI_ERDP_EHB); +} + +static bool try_get_event_trb(XHCIQState *s, XHCITRB *trb) +{ + if (check_event_trb(s, trb)) { + consume_event(s); + return true; + } + return false; +} + +static void wait_event_trb(XHCIQState *s, XHCITRB *trb) +{ + XHCIQTRState *tr =3D &s->event_ring; uint32_t value; guint64 end_time =3D g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND; =20 @@ -306,30 +343,24 @@ static void wait_event_trb(XHCIQState *s, XHCITRB *tr= b) value =3D xhci_op_readl(s, XHCI_OPER_REG_USBSTS); g_assert(value & XHCI_USBSTS_EINT); =20 - /* With MSI-X enabled, IMAN IP is cleared after raising the interrupt = */ - value =3D xhci_intr_readl(s, 0, XHCI_INTR_REG_IMAN); - g_assert(!(value & XHCI_IMAN_IP)); - - xhci_op_writel(s, XHCI_OPER_REG_USBSTS, XHCI_USBSTS_EINT); /* clear EI= NT */ - - qtest_memread(s->parent->qts, er_addr, &t, TRB_SIZE); - - trb->parameter =3D le64_to_cpu(t.parameter); - trb->status =3D le32_to_cpu(t.status); - trb->control =3D le32_to_cpu(t.control); + if (0) { + /* + * With MSI-X enabled, IMAN IP is cleared after raising the interr= upt, + * but if concurrent events may be occurring, it could be set agai= n. + */ + value =3D xhci_intr_readl(s, 0, XHCI_INTR_REG_IMAN); + g_assert(!(value & XHCI_IMAN_IP)); + } =20 - g_assert((trb->status >> 24) =3D=3D CC_SUCCESS); + if (!check_event_trb(s, trb)) { + g_assert_not_reached(); + } + g_assert_cmpint((trb->status >> 24), =3D=3D, CC_SUCCESS); g_assert((trb->control & TRB_C) =3D=3D tr->trb_c); /* C bit has been s= et */ =20 - tr->trb_idx++; - if (tr->trb_idx =3D=3D tr->trb_entries) { - tr->trb_idx =3D 0; - tr->trb_c ^=3D 1; - } - /* Update ERDP to processed TRB addr and EHB bit, which clears EHB */ - er_addr =3D tr->addr + tr->trb_idx * TRB_SIZE; - xhci_intr_writel(s, 0, XHCI_INTR_REG_ERDP_LO, - (er_addr & 0xffffffff) | XHCI_ERDP_EHB); + xhci_op_writel(s, XHCI_OPER_REG_USBSTS, XHCI_USBSTS_EINT); /* clear EI= NT */ + + consume_event(s); } =20 static void set_link_trb(XHCIQState *s, uint64_t ring, uint32_t c, @@ -763,6 +794,106 @@ static ssize_t xhci_submit_scsi_cmd(XHCIQState *s, return data_len - le32_to_cpu(csw.residue); /* bytes copied */ } =20 +/* + * Submit command with CSW sent ahead of CBW. + * Can only be no-data or data-out commands (because a data-in command + * would interpret the CSW as a data-in). + */ +static ssize_t xhci_submit_out_of_order_scsi_cmd(XHCIQState *s, + const uint8_t *cmd, uint8_t cmd_len, + void *data, uint32_t data_len) +{ + struct usb_msd_cbw cbw; + struct usb_msd_csw csw; + uint64_t trb_data, csw_data; + XHCITRB trb, csw_trb; + uint64_t tag, csw_tag; + bool got_csw =3D false; + + /* TRB data payload */ + trb_data =3D xhci_guest_zalloc(s, data_len > sizeof(cbw) ? data_len : = sizeof(cbw)); + csw_data =3D xhci_guest_zalloc(s, sizeof(csw)); + + /* Issue a transfer ring ep 2 data (in) */ + memset(&csw_trb, 0, TRB_SIZE); + csw_trb.parameter =3D csw_data; + csw_trb.status =3D sizeof(csw); + csw_trb.control |=3D TR_NORMAL << TRB_TYPE_SHIFT; + csw_trb.control |=3D TRB_TR_IOC; + csw_tag =3D submit_tr_trb(s, s->slotid, 2, &csw_trb); + + memset(&cbw, 0, sizeof(cbw)); + cbw.sig =3D cpu_to_le32(0x43425355); + cbw.tag =3D cpu_to_le32(0); + cbw.data_len =3D cpu_to_le32(data_len); + cbw.flags =3D 0x00; + cbw.lun =3D 0; + cbw.cmd_len =3D cmd_len; /* cmd len */ + memcpy(cbw.cmd, cmd, cmd_len); + qtest_memwrite(s->parent->qts, trb_data, &cbw, sizeof(cbw)); + + /* Issue a transfer ring ep 3 data (out) */ + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D trb_data; + trb.status =3D sizeof(cbw); + trb.control |=3D TR_NORMAL << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 3, &trb); + + wait_event_trb(s, &trb); + if (trb.parameter =3D=3D csw_tag) { + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + got_csw =3D true; + if (!try_get_event_trb(s, &trb)) { + wait_event_trb(s, &trb); + } + } + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + + if (data_len) { + qtest_memwrite(s->parent->qts, trb_data, data, data_len); + + /* Issue a transfer ring ep 3 data (out) */ + memset(&trb, 0, TRB_SIZE); + trb.parameter =3D trb_data; + trb.status =3D data_len; /* data_len bytes, no more packets */ + trb.control |=3D TR_NORMAL << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + tag =3D submit_tr_trb(s, s->slotid, 3, &trb); + wait_event_trb(s, &trb); + if (trb.parameter =3D=3D csw_tag) { + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + got_csw =3D true; + if (!try_get_event_trb(s, &trb)) { + wait_event_trb(s, &trb); + } + } + g_assert_cmphex(trb.parameter, =3D=3D, tag); + g_assert_cmpint(TRB_TYPE(trb), =3D=3D, ER_TRANSFER); + } else { + /* No data */ + } + + if (!got_csw) { + wait_event_trb(s, &csw_trb); + g_assert_cmphex(csw_trb.parameter, =3D=3D, csw_tag); + g_assert_cmpint(TRB_TYPE(csw_trb), =3D=3D, ER_TRANSFER); + } + + qtest_memread(s->parent->qts, csw_data, &csw, sizeof(csw)); + + guest_free(&s->parent->alloc, trb_data); + guest_free(&s->parent->alloc, csw_data); + + g_assert(csw.sig =3D=3D cpu_to_le32(0x53425355)); + g_assert(csw.tag =3D=3D cpu_to_le32(0)); + if (csw.status) { + return -1; + } + return data_len - le32_to_cpu(csw.residue); /* bytes copied */ +} + #include "scsi/constants.h" =20 static void xhci_test_msd(XHCIQState *s) @@ -797,6 +928,11 @@ static void xhci_test_msd(XHCIQState *s) g_assert_not_reached(); } =20 + /* Try an "out of order" command */ + if (xhci_submit_out_of_order_scsi_cmd(s, scsi_cmd, 6, mem, 0) < 0) { + g_assert_not_reached(); + } + /* Report LUNs */ memset(scsi_cmd, 0, sizeof(scsi_cmd)); scsi_cmd[0] =3D REPORT_LUNS; --=20 2.47.1 From nobody Sat Nov 15 22:23:01 2025 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1746156907; cv=none; d=zohomail.com; s=zohoarc; b=euUvnxizPvIwTcIGsywDIag4s9ltWVJS0/vOluPT4HmQmT8w9eBvcMSg1JV0WiMGBi968a/RUdkd3RLy5U8EhDC3YBui/bTmKsJSbKFGBV9vRVfRzWUAW3/tnQEFzWhq510CIrZQazfNwDGsqznEcoLrs8kP9DdcUcnuuAoRKRg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1746156907; 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:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=AvJbFHq84bzdUxQ3+x8hU4VLddarGy3zAWWQFK08MCg=; b=VNo4svrqzraCVTRoGVSJLzP8rpZ42E/hx5N7LmMckI7AEoW6cGYH+gsYICgDQNJ6C5JoG550eAvB+X5KDpq/LgFNODtNqfNKMLLX9FDS0PxpUEeGjUzrbqEFWfZBFngrH5KyawhIMF1PFSF5lE3h7t7lLXkqaadMqLb2kita0YI= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17461569072871023.3154994265557; Thu, 1 May 2025 20:35:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uAh9Q-0008Ko-Ov; Thu, 01 May 2025 23:33:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uAh93-0007k4-CD for qemu-devel@nongnu.org; Thu, 01 May 2025 23:33:01 -0400 Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uAh90-0001P1-Sk for qemu-devel@nongnu.org; Thu, 01 May 2025 23:33:01 -0400 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-736ad42dfd6so1427762b3a.3 for ; Thu, 01 May 2025 20:32:58 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74059063f6esm488055b3a.139.2025.05.01.20.32.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 May 2025 20:32:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746156777; x=1746761577; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AvJbFHq84bzdUxQ3+x8hU4VLddarGy3zAWWQFK08MCg=; b=djxqTyah3G5HEgNzSN0fNXA7GKoBwVraLZAnOtFUjM7g292nabHUhr9PBRPiwCRaTQ FK4GO7xNON292OQlkZrvpMJTP3DQKMS4rFGba1sMVe81itubjQG2GMAoPnYrlDLwV/td 6RCk5yUVgGMaQK880cCT98mmCiKXGfs7CoozShEFGP0wfEFYO/2j4jwLhyaKeHldM5tc SABSiKZO3IyDxzaNQmWhwngV5aztygn0dSL22PGcrchjUFIXwUclR6uKVX2Mzyuf5mih xuiKVc7+96Ose0yDJjmlNWllmvO0ZXk2KMSjislvh05HJbHzMj7eozXghRFKdYKcSCKw BBCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746156777; x=1746761577; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AvJbFHq84bzdUxQ3+x8hU4VLddarGy3zAWWQFK08MCg=; b=mU2I7UdqrA2MmBb+nL7emVHe8JzryOBDiLuGnZCpHMs/JI7xUKeNiIkuh7+wFV2dt9 5Ss2Gl/Ynw3x4NH6lZ7NNIyQZjhWPV0AfzJ+XTK9IKD6NK7a2q5rremgkcGeGUZNHqs8 n6wdwp7VRSmwM3Hf5dCmi7dIHFsbtgTBb9xzXiMFAvq0o9DLKk5uQuhcgppOJanfgK+d ijgqdp9Rzsea38xxpvWaffmx091OpDA/q67XTFLr7BZg1ZSwE6SCET/OjY3osShFhF9K shF4+I0qxAsFVP3fNkigyTG8APe0vuO2Y84SS0+F4fpNsN/9l/egD8Id6QC7udxQRVV5 DObQ== X-Forwarded-Encrypted: i=1; AJvYcCW0uTAA5tCAs5Vfkp/Vu53OnRn2eT5mwdPjcBO+oNw5y1ty/oNHvNzLSiOb6uYBKE+Xqtx98nWqrxPv@nongnu.org X-Gm-Message-State: AOJu0YxCv5dMnG5fd5isXMXYgsQWuk39cs7yQ6UCHu3KXfF7/fNA4gVK iv4eX/kfBixoLQZ00IlDGkYFLJpvf8DmgWJ20dqtZ7XN/63uuvuz X-Gm-Gg: ASbGnctjl6TT3tKQ4mh2+nrvbSi6jC2SQCtQqXbNhuAwDRa4A1SBtBLzlzcxRppCbvQ Jt29bKCSSnlqcbsllBiKKvJrDXzfJfJpXQPpIJ+dJEhh6Vodht6NaBlCKz15lmY2aFBBi60DE1F wuZUFqwyVkpITGAdyrPKZECBWChrwIfcxg5Pgi3AHMNfbo/PGCyojTtwPFe9HenuGtR7d/T9STA BZe9YVLx8ELWXkydPRVVu57mTMueT1t4QEKRyytMcgqf8gBHPacMRmif6JY/EgYWfRZqVZK9vLK p66lL3qq1+/O+RLISLLQitS9KRXbuWA4WnJTm//IDPyT X-Google-Smtp-Source: AGHT+IH+3Wpj1+PnaiBPvat4oi8JI/KtEFPaT+JvKYIsSuoYf/0sgEvX6NfPDsfNID52W5bz5R/Shg== X-Received: by 2002:a05:6a00:3286:b0:739:4a30:b900 with SMTP id d2e1a72fcca58-74058a1aa27mr1904280b3a.7.1746156772563; Thu, 01 May 2025 20:32:52 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Marcel Apfelbaum , Fabiano Rosas , Laurent Vivier , Phil Dennis-Jordan , Bernhard Beschow , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 22/22] usb/msd: Add more tracing Date: Fri, 2 May 2025 13:30:46 +1000 Message-ID: <20250502033047.102465-23-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250502033047.102465-1-npiggin@gmail.com> References: <20250502033047.102465-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42c; envelope-from=npiggin@gmail.com; helo=mail-pf1-x42c.google.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: 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 @gmail.com) X-ZM-MESSAGEID: 1746156908631124100 Add tracing for more received packet types, cbw_state changes, and some more SCSI callbacks. These were useful in debugging relaxed packet ordering support. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Nicholas Piggin --- hw/usb/dev-storage.c | 61 +++++++++++++++++++++++++++++++++----------- hw/usb/trace-events | 11 +++++++- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index f421bd1f8dd..79f857de599 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -185,6 +185,21 @@ static const USBDesc desc =3D { .str =3D desc_strings, }; =20 + +static void usb_msd_change_cbw_state(MSDState *s, USBMSDCBWState cbw_state) +{ + g_assert(s->cbw_state !=3D cbw_state); + s->cbw_state =3D cbw_state; + trace_usb_msd_cbw_state(s->cbw_state); +} + +static void usb_msd_set_cbw_state(MSDState *s, USBMSDCBWState cbw_state) +{ + if (s->cbw_state !=3D cbw_state) { + usb_msd_change_cbw_state(s, cbw_state); + } +} + static void usb_msd_data_packet_complete(MSDState *s, int status) { USBPacket *p =3D s->data_packet; @@ -194,7 +209,7 @@ static void usb_msd_data_packet_complete(MSDState *s, i= nt status) * because another request may be issued before usb_packet_complete * returns. */ - trace_usb_msd_packet_complete(); + trace_usb_msd_data_packet_complete(); s->data_packet =3D NULL; p->status =3D status; usb_packet_complete(&s->dev, p); @@ -209,7 +224,7 @@ static void usb_msd_csw_packet_complete(MSDState *s, in= t status) * because another request may be issued before usb_packet_complete * returns. */ - trace_usb_msd_packet_complete(); + trace_usb_msd_csw_packet_complete(); s->csw_in_packet =3D NULL; p->status =3D status; usb_packet_complete(&s->dev, p); @@ -238,7 +253,11 @@ static void usb_msd_fatal_error(MSDState *s) static void usb_msd_copy_data(MSDState *s, USBPacket *p) { uint32_t len; + len =3D p->iov.size - p->actual_length; + + trace_usb_msd_copy_data(s->req->tag, len); + if (len > s->scsi_len) len =3D s->scsi_len; usb_packet_copy(p, scsi_req_get_buf(s->req) + s->scsi_off, len); @@ -271,6 +290,8 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t l= en) MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p =3D s->data_packet; =20 + trace_usb_msd_transfer_data(req->tag, len); + if (s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { if (req->cmd.mode =3D=3D SCSI_XFER_TO_DEV) { usb_msd_fatal_error(s); @@ -333,19 +354,19 @@ void usb_msd_command_complete(SCSIRequest *req, size_= t resid) s->data_len -=3D len; } if (s->data_len =3D=3D 0) { - s->cbw_state =3D USB_MSD_CBW_CSW; + usb_msd_change_cbw_state(s, USB_MSD_CBW_CSW); } /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_data_packet_complete(s, USB_RET_SUCCESS); } else if (s->data_len =3D=3D 0) { - s->cbw_state =3D USB_MSD_CBW_CSW; + usb_msd_change_cbw_state(s, USB_MSD_CBW_CSW); } =20 if (s->cbw_state =3D=3D USB_MSD_CBW_CSW) { p =3D s->csw_in_packet; if (p) { usb_msd_send_status(s, p); - s->cbw_state =3D USB_MSD_CBW_NONE; + usb_msd_change_cbw_state(s, USB_MSD_CBW_NONE); /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_csw_packet_complete(s, USB_RET_SUCCESS); } @@ -388,7 +409,7 @@ void usb_msd_handle_reset(USBDevice *dev) } =20 memset(&s->csw, 0, sizeof(s->csw)); - s->cbw_state =3D USB_MSD_CBW_NONE; + usb_msd_set_cbw_state(s, USB_MSD_CBW_NONE); =20 s->needs_reset =3D false; } @@ -439,6 +460,8 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPacket= *p) { MSDState *s =3D USB_STORAGE_DEV(dev); =20 + trace_usb_msd_cancel_io(); + if (p =3D=3D s->data_packet) { s->data_packet =3D NULL; if (s->req) { @@ -491,11 +514,14 @@ static void usb_msd_handle_data_out(USBDevice *dev, U= SBPacket *p) SCSIDevice *scsi_dev; int len; =20 + trace_usb_msd_data_out(p->iov.size, s->data_len); + switch (s->cbw_state) { case USB_MSD_CBW_NONE: if (!try_get_valid_cbw(p, &cbw)) { goto fail; } + trace_usb_msd_cbw_out(); scsi_dev =3D scsi_device_find(&s->bus, 0, 0, cbw.lun); if (scsi_dev =3D=3D NULL) { qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW LUN %d\n", @@ -505,11 +531,11 @@ static void usb_msd_handle_data_out(USBDevice *dev, U= SBPacket *p) tag =3D le32_to_cpu(cbw.tag); s->data_len =3D le32_to_cpu(cbw.data_len); if (s->data_len =3D=3D 0) { - s->cbw_state =3D USB_MSD_CBW_NODATA; + usb_msd_change_cbw_state(s, USB_MSD_CBW_NODATA); } else if (cbw.flags & 0x80) { - s->cbw_state =3D USB_MSD_CBW_DATAIN; + usb_msd_change_cbw_state(s, USB_MSD_CBW_DATAIN); } else { - s->cbw_state =3D USB_MSD_CBW_DATAOUT; + usb_msd_change_cbw_state(s, USB_MSD_CBW_DATAOUT); } if (s->unknown_in_packet) { if (s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { @@ -540,7 +566,6 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) break; =20 case USB_MSD_CBW_DATAOUT: - trace_usb_msd_data_out(p->iov.size, s->data_len); if (s->unknown_in_packet) { error_report("usb-msd: unknown_in_packet in DATAOUT state"); goto fail; @@ -562,7 +587,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) } s->data_len -=3D len; if (s->data_len =3D=3D 0) { - s->cbw_state =3D USB_MSD_CBW_CSW; + usb_msd_change_cbw_state(s, USB_MSD_CBW_CSW); } } } @@ -579,6 +604,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) return; =20 fail: + trace_usb_msd_bad_packet(); p->status =3D USB_RET_STALL; } =20 @@ -587,8 +613,11 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) MSDState *s =3D (MSDState *)dev; int len; =20 + trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); + switch (s->cbw_state) { case USB_MSD_CBW_NONE: + trace_usb_msd_unknown_in(p->iov.size); if (s->unknown_in_packet) { qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: second IN packet was" "received before CBW\n"); @@ -602,12 +631,13 @@ static void usb_msd_handle_data_in(USBDevice *dev, US= BPacket *p) case USB_MSD_CBW_NODATA: case USB_MSD_CBW_DATAOUT: if (s->unknown_in_packet) { - error_report("usb-msd: unknown_in_packet in DATAOUT state"); + error_report("usb-msd: unknown_in_packet in DATAOUT/NODATA sta= te"); goto fail; } if (!check_valid_csw(p)) { goto fail; } + trace_usb_msd_csw_in(); if (s->data_len !=3D 0) { qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: CSW received before " "all data was sent\n"); @@ -621,6 +651,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) break; =20 case USB_MSD_CBW_CSW: + trace_usb_msd_csw_in(); if (s->unknown_in_packet) { error_report("usb-msd: unknown_in_packet in CSW state"); goto fail; @@ -636,12 +667,11 @@ static void usb_msd_handle_data_in(USBDevice *dev, US= BPacket *p) p->status =3D USB_RET_ASYNC; } else { usb_msd_send_status(s, p); - s->cbw_state =3D USB_MSD_CBW_NONE; + usb_msd_change_cbw_state(s, USB_MSD_CBW_NONE); } break; =20 case USB_MSD_CBW_DATAIN: - trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); if (s->unknown_in_packet) { error_report("usb-msd: unknown_in_packet in DATAIN state"); goto fail; @@ -658,7 +688,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) } s->data_len -=3D len; if (s->data_len =3D=3D 0) { - s->cbw_state =3D USB_MSD_CBW_CSW; + usb_msd_change_cbw_state(s, USB_MSD_CBW_CSW); } } } @@ -676,6 +706,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) return; =20 fail: + trace_usb_msd_bad_packet(); p->status =3D USB_RET_STALL; } =20 diff --git a/hw/usb/trace-events b/hw/usb/trace-events index dd04f14add1..851ba9986c3 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -264,12 +264,21 @@ usb_msd_maxlun(unsigned maxlun) "%d" usb_msd_send_status(unsigned status, unsigned tag, size_t size) "status %d= , tag 0x%x, len %zd" usb_msd_data_in(unsigned packet, unsigned remaining, unsigned total) "%d/%= d (scsi %d)" usb_msd_data_out(unsigned packet, unsigned remaining) "%d/%d" +usb_msd_unknown_in(unsigned packet) "%d" +usb_msd_cbw_out(void) "" +usb_msd_csw_in(void) "" usb_msd_packet_async(void) "" -usb_msd_packet_complete(void) "" +usb_msd_data_packet_complete(void) "" +usb_msd_csw_packet_complete(void) "" +usb_msd_bad_packet(void) "" usb_msd_cmd_submit(unsigned lun, unsigned tag, unsigned flags, unsigned le= n, unsigned data_len) "lun %u, tag 0x%x, flags 0x%08x, len %d, data-len %d" usb_msd_cmd_complete(unsigned status, unsigned tag) "status %d, tag 0x%x" +usb_msd_copy_data(unsigned tag, unsigned len) "tag 0x%x len %d" +usb_msd_transfer_data(unsigned tag, unsigned len) "tag 0x%x len %d" usb_msd_cmd_cancel(unsigned tag) "tag 0x%x" +usb_msd_cancel_io(void) "" usb_msd_fatal_error(void) "" +usb_msd_cbw_state(unsigned cbw_state) "cbw-state %d" =20 # dev-uas.c usb_uas_reset(int addr) "dev %d" --=20 2.47.1