From nobody Tue Apr 15 23:49:03 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=1744361784; cv=none; d=zohomail.com; s=zohoarc; b=J67wU7Jr5p0UFezjLIkYptlxkC0IZqYJdvOL9QvDIpLdt+mpi9RFc7dMcal7Vpe4hfYplI650k6H1Rqgj0CjhXcADBusb/wn6x1yq5+uaN8s70DrcV4fy/tUu8xVWVS43Yl6sPPPjZnA43BmVD+y0fuDalxYgH26wZsVZqVB7vM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361784; 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=0WKAS2lW3F9cGbzI+GOHbYGkJMNKj458fWBIwWUCpIs=; b=lwOHy+CyfQMrqQmBoK1DBDFw5NIh78xdULaUrsxhMja2gwCZXkLj+opQw4gRcyFnp94+zLCSYx01m/NV5kHZOSHQbNqVmhGNjlh+EZaY7Jr8BsDrby3R/hGvs3C1RcPsEUUaTI27pZJeMPmeTmJQp3NVNC833bykz3KYk9Ecsp0= 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 1744361784877260.66309749385243; Fri, 11 Apr 2025 01:56:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39Na-0001pa-Kp; Fri, 11 Apr 2025 04:04:50 -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 1u39NU-0001p9-Cr for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:44 -0400 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39NS-0004gI-3d for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:43 -0400 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-224341bbc1dso16194265ad.3 for ; Fri, 11 Apr 2025 01:04:41 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.04.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:04:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358681; x=1744963481; 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=0WKAS2lW3F9cGbzI+GOHbYGkJMNKj458fWBIwWUCpIs=; b=fs8tF9Om8mIb3RS7k1fTSwZPPGJPr6wh6dY79UD9MlS/bdZ/qbr/VHJcEEDVad1Gkj WlHIpdZU2i/wDxcnooXXG5u4iXso3d7ykAu8g6lAzU1W3KdtTH0bKMMsixvkFU1lLDsn IWloro35pyKqahXu2fnYiRkjFFbrx2Ct+Cv5pvKq9eUopBLXpd1C2D/FC3gmaLJQi6yj +yY+jEi/Kt/ftv+2OVXazik8SShXpmyO07lqEm6OtmDdmWRqxDv3gSZPTdumydvAnezS lnjYwLw3DoQpZS+7v6MwYaVFyqJX6eARqDCDTdIJki6CJ7v1JMFZ3lQDhGNjkhzF4IJW JaBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358681; x=1744963481; 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=0WKAS2lW3F9cGbzI+GOHbYGkJMNKj458fWBIwWUCpIs=; b=pCYz4HZCeLKct2N15ogPbJ2c8UAlncw4YFF+kfsfd0JyuzLKljZ9gpAJFPlCiP54NX BUYfBO9gyQZGor45/DIZd+mDenxMk8USCEOtGHaVnFO1xWMKpLDxPcNKshOAx6uYuccO zwilGJelWbtiCdZSzj4dcpvkvOcxzCsne1hxY1awEkxY3rY1F/uwHNcmyiz295Ec7V0j syDOEL6zPPOYrKmoOLgjUH1HqKdArblxUuIUDVBKXeRp9k2RnXQ41ZTrXGAallCRRWKY 4QTXLSg6M58dxXmqXFxStBE+sriJqJ6fGTD4rcWhx9W6fcDBIVBu5ooWUDuvrwmIGldh TRlA== X-Forwarded-Encrypted: i=1; AJvYcCUaukBHMtaqyH0Ype5t1HK/qsLrkwPtr0Yr9q3tEhU41rM/70wX3c8+9Gabv1xK5YNbPxmEwWon/ydv@nongnu.org X-Gm-Message-State: AOJu0YzvGrpWV3aTjbHoVil2hjqSSUD05oQytTLkzHG4QQBIfqxsv53R waZGwDJEL0dxrRARUzr+LPLj1E1HaH/clYWlooR2bUQ1UaNgr5xYocauaw== X-Gm-Gg: ASbGncu1EqOHRouTMr40iwVMnCf0yyrzTfI3TJEi7mcDjA0g9CSFKKu8yS5xQxTKYpB YxLcfXeF5cQ8iZVZVmz5pIUFadA7DbYoyZ4DBknl0Io0MuHvPlL2tVPP+PEy9eybi2eUNzFSAKp wIJ2kDaHUJR6GG0ghuJwuPpskkmnrjzduVAGA4k83JDh1TtW+c5pQCnL2N48W6ieN1W4VDbWz+O U8velhFQdFXr+RvkeVFECYGxcpKchzX8C6HVTiIdufaUY4zfNZ4AVw6W3L6hC3hGh5TLEpY5O2k 0qHjf+RFw3iY1SEDB+HwqaeScSzskszB3WLJXO//HSz9 X-Google-Smtp-Source: AGHT+IHWyZqUhg0vdL+1tKkfn9IHvpu8o+3ecO+WfpidO+FfwXLXbRUB6J+3w0kl60RLqjcLunm5gw== X-Received: by 2002:a17:902:ef12:b0:223:fb3a:8647 with SMTP id d9443c01a7336-22bea4f2773mr31303755ad.41.1744358680704; Fri, 11 Apr 2025 01:04:40 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 01/10] usb/msd: Split in and out packet handling Date: Fri, 11 Apr 2025 18:04:22 +1000 Message-ID: <20250411080431.207579-2-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::630; envelope-from=npiggin@gmail.com; helo=mail-pl1-x630.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: 1744361785480019000 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 --- 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 4f1e8b7f6cb..2d7306b0572 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 Tue Apr 15 23:49:03 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=1744361818; cv=none; d=zohomail.com; s=zohoarc; b=Mtd0SJWOnZisEOh41bViaKEcHj2ySZWPTsyw5Oaz0U5v4B5NR76IsXA4U/Yf+OgjO251MBjSHz98e82j3fBGdkJko4GcNFtjVLiiPps9MWo7X34ap5ZjflB5cJrFi7xIk8F6DP8yKz+BERaqOIi+B3yujRiyJUQ8ezD/S/mkISU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361818; 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=u9ic4B/rwU6lGVm2qywvY/LkwDOCVoie+dMhossDunE=; b=W1TD/tWTWEd5IieGypUF7u86hHibnAhglrxV2qizI5ElkBo/NsHToLBXLqeS1SMpR16PBzQ5tAWcZKR8iYmdNXet5CLkOrsVwxlKyfvIxjLKAWqoaV+sJqP+2fgNM8RD0eRqDWnV38KMrZwVru3FLxtHMs+JGlgYB+EjvRknY68= 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 1744361818148717.3028484648172; Fri, 11 Apr 2025 01:56:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39Nh-0001sG-EK; Fri, 11 Apr 2025 04:04:57 -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 1u39Ne-0001rQ-Nx for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:54 -0400 Received: from mail-pg1-x534.google.com ([2607:f8b0:4864:20::534]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39NZ-0004ga-BO for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:54 -0400 Received: by mail-pg1-x534.google.com with SMTP id 41be03b00d2f7-7fd35b301bdso2017147a12.2 for ; Fri, 11 Apr 2025 01:04:44 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.04.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:04:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358683; x=1744963483; 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=u9ic4B/rwU6lGVm2qywvY/LkwDOCVoie+dMhossDunE=; b=mN5WMkC3wJeT3Kq35vl4d+yK3JKfMydTtwBYiRa8hIngzKfdyPf8cy+wzM3oQFAdQX o/cr8GRDWHb9WT2nLfwAO0PbWF8R0Gw16Wuk2ed7PBh3vr9jp7PSePmB9TbzPGgGkgm8 mPcVQGVp6e4W8TB8v3efBYQd9WeYzM5SGPKbY1tHWO4aoN2cKz5uLfjHVGPV+zvbebCa h34HQ6RvT34SZChGpsKDbJVhP2r57agqKJcYIQRsrsreTLA+/hJ+vmz52Z/5VhRwggXM qu0F7+wImZSJ7yR0+AvOXutWzoz/cvQfjMjHNAVocltgGhApqM/oPprdpClVQcfriSrb toSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358683; x=1744963483; 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=u9ic4B/rwU6lGVm2qywvY/LkwDOCVoie+dMhossDunE=; b=uwGAs+SuWlD57wS2y8P4a00OiyKEFiiY365pKh88q6w4k39dmGsI2QhS5wGWwMUOgK FS0HwomueTedsEwvfm4NrprwirxP0Uc59SNqsT80KtCyjSjTLjOpbeVGPMt2a5l1bp3A 4QTEPsf5QoZTYqtluv9q3tyvaTRj4UGsoh1jCzJOMVmMVtVAjzwfsDZkKEBLRDbrDLxR cGWAIepb7iEDuzsGYZgmvMVtC+jQSftZDlsE0v/dUIsD6X8RNU6DG8NnDmE0n62IfN1n zf4UKGpoC3uFeopR4V5Z9pDyxXefgxJQe708TkNo6JNtbFGWxVcyu6Rfn88+GBtqcQId o9SQ== X-Forwarded-Encrypted: i=1; AJvYcCWPXZ+PHCDiSnq5s7r3uGf1/SlpDtQggBzNZK6mkqPZshZ6PkR9XJ0M8J//V9SrN7pjNUY9QV8f36Lb@nongnu.org X-Gm-Message-State: AOJu0Yxw8iTOZu/2XySqXp3sVyMFj9DVWGY8YZqS/goAfx6sBSxhkCHG UWSqtJYcjPCZppoZt7IHSARgh0sCHon7RZqCmX+IYZxV5zQI/SldlivnXA== X-Gm-Gg: ASbGncuXKMdQin4ttVkeS5CKQTbdcehLRvPV5fkMNcDvJLBKNnYhz6PrpmgIWTkUMyk mqEUFfeoQRs3EYkyVxyQNpcKRPY5jQYgnCqaXqTsnQO3RWQEwKdYA8C3HlzLt8W2KAUVkQoVr/j CoqYqF8ADolaiiSCR9XpJlm3Fc51QdEuoVjbSlvhwTSFN8eruc5QYIYs1jTh2y2ljF3lh8C4w7c vmAkM0LrfPIh+6FaM3QjuhUYWVUK9s/bEx0wO3A3ByFckwjgb0IVyA25PLk3SypdxgLn+GlI4rW D5Zw4hap1ePlfDJB+uyp7R91GSRknfGJ8F2FZjBdjeB/iHoVw13tC3E= X-Google-Smtp-Source: AGHT+IF0OPk/55gcEkFEpI6rO3/SP7YEYmaeTnn7a2qa0EHNLOmfwGxyvgIXfMNu1JRxstPq8lsxNw== X-Received: by 2002:a17:903:1b67:b0:223:5379:5e4e with SMTP id d9443c01a7336-22bea4a1d11mr30990005ad.10.1744358683451; Fri, 11 Apr 2025 01:04:43 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 02/10] usb/msd: Ensure packet structure layout is correct Date: Fri, 11 Apr 2025 18:04:23 +1000 Message-ID: <20250411080431.207579-3-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::534; envelope-from=npiggin@gmail.com; helo=mail-pg1-x534.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: 1744361819552019000 Content-Type: text/plain; charset="utf-8" These structures are hardware interfaces, ensure the layout is correct. Signed-off-by: Nicholas Piggin Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/usb/dev-storage.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 2d7306b0572..87c22476f6b 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -27,7 +27,7 @@ #define MassStorageReset 0xff #define GetMaxLun 0xfe =20 -struct usb_msd_cbw { +struct QEMU_PACKED usb_msd_cbw { uint32_t sig; uint32_t tag; uint32_t data_len; @@ -636,6 +636,9 @@ static const TypeInfo usb_storage_dev_type_info =3D { =20 static void usb_msd_register_types(void) { + qemu_build_assert(sizeof(struct usb_msd_cbw) =3D=3D 31); + qemu_build_assert(sizeof(struct usb_msd_csw) =3D=3D 13); + type_register_static(&usb_storage_dev_type_info); } =20 --=20 2.47.1 From nobody Tue Apr 15 23:49:03 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=1744361882; cv=none; d=zohomail.com; s=zohoarc; b=GJBbjDSkwWvKN6GZV/3OHgKEwTANtXCyFVM3l0NKAvSX8SGVgo+MjJgF7XL/c7rxGStDhIjZrOe76W9K5dQDQ8R7Z62V9rumDcGd6PAo0VcNQleur1pFJ0Ume1jUc4MG4V1DPKQb/u8BCYFfCcUpXw+Wa2UMo/8bFT4cnY8MtXQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361882; 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=psVuI87MgixikN4jJgvMHXBIVk6lAWoIadR2oAOKt7g=; b=U+k8rqIJ/rURltDDkl4XTNPAqBmZnm0fAxMi92S20G6lKJzqz8xi+3sQAU+Hha/dNoQUy3tsc1+uRyHllXOxgiI8svj2pJdbu+tlsZck2vfQU5e9Z3e5fyrvYnYKKJmYASYg5wrA6XeQrgmHNMWsGnaGMfp0CuPpVLIqDaaWM8U= 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 1744361882755847.8750516201688; Fri, 11 Apr 2025 01:58:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39Nd-0001qt-Qm; Fri, 11 Apr 2025 04:04: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 1u39Nb-0001qI-SP for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:51 -0400 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39Na-0004hG-0R for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:51 -0400 Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-227914acd20so23172645ad.1 for ; Fri, 11 Apr 2025 01:04:47 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.04.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:04:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358686; x=1744963486; 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=psVuI87MgixikN4jJgvMHXBIVk6lAWoIadR2oAOKt7g=; b=CNVDP8mhdqtVZ0lva0BZ0mAZIz5BK/i/3QCnyW7Ext/Y7iXRb2hvYuSpbsxHi7Aiqq GTmd87I9/4e5rU5EMH/u75ZO1FJVOPNj/QqwZEwaCGXzyTQRdOX5MJwzfMRaDE9+v6pC ZFcjMR/GEBDdywFIljOnicgJ3ApUWWUvos+qjbwKHpmcpieXuJdfSwpx5NGOOQu9rMkc 80qBeFA+g8na45QjEc+7HJXfLBKDngkjz7XsNK9ymbu9Esb2NOkeVy3+X2nCruSHyo45 mePLEiXPQEfnRlTiKR+PO9UurDmJf3bx9NdWGERPK4/88bKRioMvdFFhjfJvcGzVhsEd 5itg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358686; x=1744963486; 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=psVuI87MgixikN4jJgvMHXBIVk6lAWoIadR2oAOKt7g=; b=Ga7k7EM5Cx02wxodFa0Go0ZU6eUQTh1SJbg5UYe2Q3WvxaJl6vj1prJH6f0bR8uC4e jkl/h2MEQDwVR7RcT1rdfYMB1pM91JMjpqdrCK3PUJunkDsr76OXaqhA5Lk/lvidJEqu ilZyEmel4eshM0GCIDyDNDO/simtuuBe7wJ3XBmcbY7pdMeDF5m9mMQSg33B4tV61/PN gDhpcremwEKUBZQ/bHid8TRqM/rynGpDzCNuqamaTeBueRqhVFv1qHEt3JkLlqHS3eTy zZpRI2f+pb0/NPCsnDFUAkXTVpIwZ4QzrOyJ0GolkfgSr1y4TELYnnVb9KujwHjb/msK KzLg== X-Forwarded-Encrypted: i=1; AJvYcCW/xXMaFCuUYdPNjiA54QBhxrpdofn5ooSaE7PKzfSaHZFT7cfw8wYeNdlhokpmavZBa/JyS6FCSsRB@nongnu.org X-Gm-Message-State: AOJu0YyYX16xqHnoU9C0VJjwbUz6Gp4Em1p8vuFd0GrPLN0xe3hoYic5 ovyKE/g/2q8+7FhqHX0O+EAkOm+J1l1sqYQqXUc3uTs+usq+VTWP9Arfsg== X-Gm-Gg: ASbGnctZ5glGpRnGwNnMVkTEouHdJNi7sMVa8wc/GZMmtOby3hmXqiYWNKAzf+NaZS8 DA3yG0x4K7Qu11CgG2brVOcd61GmtpwvjSH6aF+GCK3bPGfIJAxdTrMxaxjKesdx+D4ASYObj7G 1W9x4rQhc+BiwChoHHILYFI/5ByO5HWvh1goE1FBmBdF69sTRU6WMWYM6SPqkkGuUwdbCdQ68fL 5XC/3LaFzjFAt8uw6imxllx3eFZYnp113gd2V3bERKD2JeqYya9p49AlLoPUTyXVyBzBGPVFAFu tEDiBOAveIl+HV4ut2XEWhfJGxzt7FDC8CHdffqYgTvFl8MRYT/uSVI= X-Google-Smtp-Source: AGHT+IGTXYGBAk18Sb+hSZW48HB59IcquXvNkHfuGHeatNl6zmKx/fucqK29GOa/9e0lsdLRWhX+DQ== X-Received: by 2002:a17:902:d481:b0:221:8568:c00f with SMTP id d9443c01a7336-22b578460ffmr84413765ad.0.1744358686177; Fri, 11 Apr 2025 01:04:46 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 03/10] usb/msd: Improved handling of mass storage reset Date: Fri, 11 Apr 2025 18:04:24 +1000 Message-ID: <20250411080431.207579-4-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::62e; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62e.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: 1744361884252019100 Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Nicholas Piggin Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- 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 87c22476f6b..c7c36ac80fa 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -359,7 +359,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 Tue Apr 15 23:49:03 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=1744361177; cv=none; d=zohomail.com; s=zohoarc; b=BZ2Kwxxidkfj6hZQwbwWL4PPSS8KEO52fT4jN6Iyy3VgOqzF+o1UNPPlk7woQnspGFDmRaJD14OkVdhF27GEESzokIVwaoStFzIdqgpMVVR2SLCixoE9Rpj4EJWG9TtNVNAievVjwUqANd1nI0CD8HtBIipBh/DvmO05uFh7aQ0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361177; 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=9pVVryayk6KcWQSaSD5Yx1gPCZpLa+a+1UqcEFcEJ0I=; b=d1BNs2YydGoP+WqDQzo7wrRC4nUjzM3lMvOPRitEbYF61P2k19zryNaERyxNQIk2bE02TkGf9vb4SanEuF5kvis3EKbpM7tLSDh944hhpSyG6RlbjxYUS/vEmy0ERwJcwffuSIKu//QUZek5AEIA8E4QmhIsLWpU5kHsuIsQ3p8= 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 1744361177946577.4229093546502; Fri, 11 Apr 2025 01:46:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39Ng-0001sC-I3; Fri, 11 Apr 2025 04:04: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 1u39Nd-0001qb-78 for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:53 -0400 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39Na-0004hW-K3 for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:52 -0400 Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-22622ddcc35so21874295ad.2 for ; Fri, 11 Apr 2025 01:04:50 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.04.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:04:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358689; x=1744963489; 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=9pVVryayk6KcWQSaSD5Yx1gPCZpLa+a+1UqcEFcEJ0I=; b=QXaImOvj3b51voNOJlyqzg1opc0Sogtf+qwAiRcODvGwfLE+JH+LlQ8etNVGkUTSye LF0o5lFcReyU0fym12NkksBrNRrMMck0kucDFvgyCfVaCwlTmUgBTf0WD5S9u8AiW4xc Bo0VAV2+kzzyj+SoPv5aDpsC9dy2Z3Y6N0qfm6ao+knYOLP6RcPt9e2mIJjbFxaIPVcH n1q6Shte+7PDRI9NmjeG9obVKUUR6BV0xW3vUhHVc3+OJ4Y1Wc/WvrAQnuj/IVNDanhQ MGOuK4QL3SGLig5rrZtm1SF8R20IFfhI5p5MeugP3FGtjJvF/6mub/C/TgA9JUKJ3mVD WvKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358689; x=1744963489; 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=9pVVryayk6KcWQSaSD5Yx1gPCZpLa+a+1UqcEFcEJ0I=; b=DAbPOOXUCyMjZ2zlLjn7MMJFiDu20xmbIWUAX8lflTgK7nog6FOk5SLZA8h975h/vm dLMTZ9G923rY4ZvHGNc/+wAWU832UHHsOyQCc/XbiUMlXBPaFir1VtT+NYhI4UW7CCHe sGFWguHd8oV1C/HDycGZlt4ppmr+qKOAWVjiclMYnNXigDSyYGGev4reiLRqqrmc8ef/ O2PtgL5Hke61uw3yM5sI/B3bsDsP7V+CSRqcjx9+tsE++pEVemNabGFhW9Hww/3O/O26 T5JfQ8rtH4G4ADNlrM2K5Sfw94SpKD8v4rTFxeZVgEtRCwI8dKiIJvWh+cNTANL2vVz2 CGDw== X-Forwarded-Encrypted: i=1; AJvYcCW8fA5vFlyePruZbER1Ls2o+opggtgRXD8zuVYiASkx3ErE+FpZsI3faHWgHpa+0SRy/HQbSnZjwNuJ@nongnu.org X-Gm-Message-State: AOJu0YzlitvjSNDPfHFD/JCc/LJA0hE1JNjslMKkC08lMOOE7KpoMqso qvYEm94euAMxQiNGabmre8lxY7NF5XiEr3B82U9V1ys1oN5thaWTr3eTZQ== X-Gm-Gg: ASbGnctm20zpJF0AmV2q62dDLgfLQEoH/UwsWOsL0JdnYWaPdz0OFfAJrv2UN1yqMQj vrShgXCJDzTX3AboqE8tyiLD5x2HMD+CVO4kNhKcqb7mSzeT0FZcJ0jCz0MMDvcjW8KWdjgRQaP MoOmXnVIkcl9t6/XT+obFz1PbRE2Y8Dcy6ecei0897GBoBpytJaQ5TrAT7DrfVuJ8WVlyZh1SPy cmx8GPBV1XYrrHi5c1Z9uK6g7fOUN+gZ+PR3DI2+KTUTPY8W6Mi1GwaaK6eQrdz6qARX/b1Ravo j/CFzfw+U8WpIl9MEoV12xb1gHs3akym3CKXMXvbRLHyemXvMsU0hO8= X-Google-Smtp-Source: AGHT+IF877CSCG+jQAXpGbA5GvZXltn3M01SV+46b4XjfDeSy16W307R80U6LNcOBVHrSGtXr35A7A== X-Received: by 2002:a17:903:1b0b:b0:224:910:23f0 with SMTP id d9443c01a7336-22bea4fcc31mr31282805ad.49.1744358689006; Fri, 11 Apr 2025 01:04:49 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 04/10] usb/msd: Improve packet validation error logging Date: Fri, 11 Apr 2025 18:04:25 +1000 Message-ID: <20250411080431.207579-5-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::636; envelope-from=npiggin@gmail.com; helo=mail-pl1-x636.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: 1744361179317019000 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 --- 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 c7c36ac80fa..6668114ea74 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" @@ -395,6 +396,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 31) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW size %zu\n", + p->iov.size); + return false; + } + usb_packet_copy(p, cbw, 31); + 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 < 13) { + 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; @@ -405,19 +436,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 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)); + 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); @@ -489,9 +514,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 < 13) { + 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; @@ -499,7 +530,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 (!check_valid_csw(p)) { goto fail; } =20 --=20 2.47.1 From nobody Tue Apr 15 23:49:03 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=1744361174; cv=none; d=zohomail.com; s=zohoarc; b=eerafR4EB79WukClHjQMNpW6MBrr8fmrxVe0dXZ4Z8rxma7l5+uBCmBhW/XFaHwv9Fz0x+3pAval7cOxdkHpGJRjF0ngKpMiHO7rSRX01yXjmiitgHp/eYbCncqy1+1PBWFATk8i9DXqW7qWhiVl8/zNdYIlHPnclw2rG5lkoUM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361174; 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=SWO2MpNR+Wq7+HXx3Lk8VZg+9OETBCuvoauKUfERGVY=; b=WIsvz2bT5pXyYTwavKM89VDIZm6QnHCjjijhyEv5rmPMDmsvzfe0D1+377CN4oAXlCy+yqBbAnStuJuvb61b4LVsnGqPjVjP+4PkoZe6+Ld+NhZZcrI9kr/VQJjxoXrlT15uAagIr3QbsrHkFhZ2bC+S0oGqIsSO3miqUAhe/M8= 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 17443611748151012.2660378071156; Fri, 11 Apr 2025 01:46:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39Ng-0001s8-H4; Fri, 11 Apr 2025 04:04: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 1u39Ne-0001rP-LM for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:54 -0400 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39Nd-0004i5-1S for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:54 -0400 Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-227c7e57da2so15885055ad.0 for ; Fri, 11 Apr 2025 01:04:52 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.04.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:04:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358692; x=1744963492; 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=SWO2MpNR+Wq7+HXx3Lk8VZg+9OETBCuvoauKUfERGVY=; b=Ueh10OKSG5Zp4i0EnaF8IRB1WffvIZNkzxZ2iVRd8YQ/JlRG27XP9OfNCdHKAEKyY7 y21iVIRwo04vpLOGVDQXyS1FXHtW500Iayvc3wnkVv96sVd6QZRA9XyLq9N7yyGcPdom trXdrKSsyEWUi785ioy78a01pHc/efNwBIVEc6ZrXs//gidpYnPLtqoE/gPQDoUfmBOy P8HMpt6Vy1NV2AKVzg8CH0Yw9f+Q/28+9oGprfj4GZysY4k2Cc4jUCmK00PKuUXTRS1z VbL4O8igHd/bM2xTg8hIz9kMFA4yxrRaWaTsL2LKwk7CoLy0G//CUd+ky0f84pMWxsjt hFdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358692; x=1744963492; 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=SWO2MpNR+Wq7+HXx3Lk8VZg+9OETBCuvoauKUfERGVY=; b=GOwiYM/Xz8KPgOzP+gYHaiJi5uFuNloAoi25XVjvfUjESaRweXsAF8v9guxJJhPskH Gs95uneVyih6T/3F3xiRMCPg157nWoLRITwXcDaV/JPQYJ3ZHuZ5EgYhG4TcqQaSnBHh hICD+oUyBmLWbllj09Agb79PVlh4Y4HsnVJ+2aK1sj+lCIIMSz4EoR+jkkO/A4i6nMi4 +l+4TBSXxbjvt2PRLS9AQ+bh4ZH4SfNI75FgWyRgV8TXPRmeJsAJdJreH8uDhZreMRby hqLQC5FjltEPcIG+Wo5W6WdedL9IkQWVm1FjPpSyE9TyqGNKatFQ/RBh580dGPQUcogi 87mw== X-Forwarded-Encrypted: i=1; AJvYcCXjtTHjSCgK4eOlEjC1ZTjEz3g4UN+Ff6kiHg+bRnprwR7cMUnmP8Wx4rmvPHcZmqQFCR0BdPsQCdLn@nongnu.org X-Gm-Message-State: AOJu0YweGL17LIwTIqGqpEAmK8fTXHm/WlzgNkQKe6p+wY63t/Oy+KfD gTpeGGv8PabLmUaqQuhJuXklOoTdv0RXqIWgHR3Az4ufd1sG6utP X-Gm-Gg: ASbGnct9Zi59VeYmUptn2bsyLZtAuCDTnZX/QJeS+0YWcPaOOP71DVWxmDdmAYSnef+ jrOAa2AH41hyzyVwvYqImkaMOyZiJFb/jLxTQLDggnGK5Afj8HBKSEQp1zxXNWaR+m28cXxHqXQ u+Jma3JD6kk1rLHYjsd0gQ6xqCI3jFaNRYbo68xHh9CudCXrEDL5KhWIiXZxUtWfKXXuRjYLQqV Wxqj3Nw8H7LoTcxMqn45H0Lu9QDgc9QQV2tk1LaxmufjloCVFxbAO/1txoqkXdX/mDeJKQkD0Of ESW8XuXpwKXNzZJ5Qfzee/bjkk0X9blNAsbzeQCui4gt X-Google-Smtp-Source: AGHT+IEWLLB5jaPOfmOZqay5OMus7igJMgH2AceMaH8QP15MjI+Ue7E/Orl7N7qOICElf4nTZYoULg== X-Received: by 2002:a17:903:3c6d:b0:224:a74:28c2 with SMTP id d9443c01a7336-22bea4c3e94mr32558085ad.29.1744358691712; Fri, 11 Apr 2025 01:04:51 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 05/10] usb/msd: Allow CBW packet size greater than 31 Date: Fri, 11 Apr 2025 18:04:26 +1000 Message-ID: <20250411080431.207579-6-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::636; envelope-from=npiggin@gmail.com; helo=mail-pl1-x636.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: 1744361175266019000 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 6668114ea74..27093de5c84 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -400,7 +400,7 @@ static bool try_get_valid_cbw(USBPacket *p, struct usb_= msd_cbw *cbw) { uint32_t sig; =20 - if (p->iov.size !=3D 31) { + if (p->iov.size < 31) { qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW size %zu\n", p->iov.size); return false; --=20 2.47.1 From nobody Tue Apr 15 23:49:03 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=1744361608; cv=none; d=zohomail.com; s=zohoarc; b=azGWjwRKKksqlVm1F5vfEkV3kqlyaPaIH2PbMZhQXSecGUW2hBxyTTiReM4Vid1cAdt4pDMVXDrquzqU00FOED3o9rAiZeyllPghOM5Te1rdTVRJgdNOWEixoDZY8dcnaKYaSp1yaXa4z0xFkOVo//bM9jyT2mBMtG8Dynr1w3I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361608; 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=PJxSDZQYeqf8Hb2gA+do9aPzsB2e0PnqAicfOJ1mz2g=; b=NeWtH2kf7VS+ckqGQVyhQNRsvQLk7qwLNLZe1uvUf4je0A40SpFN2aAN/cs0+oveh2XtRUvxnukNWv9SsQHQ1wlxjQnyc47Vn0eO1OK8VbOdaIxpa6kXCYjsdPGa9ZRyd28ax1yxjKuXLw1XroDjG239/rXiDgjUd3uFQDOCXV4= 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 1744361608911533.5472079595892; Fri, 11 Apr 2025 01:53:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39Nj-0001su-Ra; Fri, 11 Apr 2025 04:04:59 -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 1u39Ni-0001sW-1S for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:58 -0400 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39Ng-0004iZ-1c for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:04:57 -0400 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-22622ddcc35so21875295ad.2 for ; Fri, 11 Apr 2025 01:04:55 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.04.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:04:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358695; x=1744963495; 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=PJxSDZQYeqf8Hb2gA+do9aPzsB2e0PnqAicfOJ1mz2g=; b=XpcUQS4TjgkRWd8oy+EeZXNv5N44mltPLPxu53mX4dEFjb2D8kE2Rz+g1tj1X/EdQe vQNb6bRkT9XsGSzfklTPlOZgO2hmO7hE1mIE/Z5fyFDkF1Lrp6k7eS1a96pA6OqjX3yD JKm/f29ZY6tNGNouzbHrAuhTsi4k3lJsB/s930HUgmc1J4O/Q30oegj3YgGpE6M4AecE 68AFqtHV7SKj1KwGgGF/1h5f1a3DTdwgCo416i3Ud7FdixQ5IO8BE4oE2f3Rh/Xybu6P vhYMXV3j4dFueMlOYC2L8zZWZjTdBJlaL9J/I2NSvzyqZtpGpILO7yV+lGhJ/mfx7mIz XOzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358695; x=1744963495; 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=PJxSDZQYeqf8Hb2gA+do9aPzsB2e0PnqAicfOJ1mz2g=; b=aJFbmUgp1sUXAUW7HFKjBHJWviFsAXS2Uldxbi5qmt7LYUzIe31xSUcYp/NvN5PnYt shQVn7FBRDO33WlSK/fc58OVCD2RW9zc8+lWXLtaMdaMZSq3RGZqeASv1uwDWcAwn8pw bhKxKI+NRHtJcZrvO7hMtla2lnrjXEUYtG3Qv3F6+8FCd48qtyG06H1QNf/u46xwyMJy 00GDqHDnNXgDTZcplFk7YJ5eudXJfvnVNwJ5loRAfDx9YKO8Mx2OYXE10oPHWMcoDscw Xt24J+NHQOuafokX/KYw3IF+931s7paFV/pbhjlpa0BYi2G5yBWtJPrFB0xsKdV77Zzi dBRw== X-Forwarded-Encrypted: i=1; AJvYcCXblACVvhlJkZFJ7YszHdbUeFGA18hmv5EBVllKnU9Cz1zq2Tl2fMbeo/0PJ1bfNFQUF6QNnfYWXoJ9@nongnu.org X-Gm-Message-State: AOJu0Yz8FdnG9p6W9PbkdpeBFccZTv+J5pm8T/eSSTA/7R0yyMe18N+r bbRoyyVHst3GkqW8tKRoZGn9gSI9wvl3ryP706xEnQY0P5DUCiEG X-Gm-Gg: ASbGncs2clLh1pxv6Cb0uWZhN4P7E63OcfkOGbz+nx6VX9B0Ndka3DP4r1u9ReidVb5 oQGKVe1v0thtbmnJSoIeyyYRpRX0f7xPB5DPmgv+32uyLnWr9vIqBsIlyKi71X2Lzm2LuCBjTD7 Y1Y47s9S8ZGXcTASTYlKSce6VFD1EW7ThgqJHnKkLiiT8QRJgjbn3PpKiDItS7mtcMDjMivX/0c 4NdnexT+AeWnxRvK7k1Bp0jpv8FHcjDwAxcSZM8pWJwWGFFymbsGwS9A6B9Wq+drLnid9WInMTE fkPXD2QA7uuQjwSWKpRuO0lz/73+FmoogyBOaS36Cuux X-Google-Smtp-Source: AGHT+IHdj+ANygVk6NjBzqvNQK5dSqVj2smJo90La0sfni+9J768wCfNyLOY/m08acpnath6KzkFyw== X-Received: by 2002:a17:903:2392:b0:223:6744:bfb9 with SMTP id d9443c01a7336-22bea4efae4mr30831195ad.41.1744358694477; Fri, 11 Apr 2025 01:04:54 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 06/10] usb/msd: Split async packet tracking into data and csw Date: Fri, 11 Apr 2025 18:04:27 +1000 Message-ID: <20250411080431.207579-7-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::62f; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62f.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: 1744361611106019000 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 27093de5c84..a9d8d4e8618 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -178,18 +178,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 @@ -197,8 +212,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 /* @@ -243,7 +262,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); @@ -254,10 +273,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); } } } @@ -265,7 +284,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 @@ -274,35 +293,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) @@ -332,8 +353,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)); @@ -388,11 +413,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 @@ -493,7 +522,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; @@ -525,7 +554,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 @@ -537,7 +566,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); @@ -565,7 +594,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 Tue Apr 15 23:49:03 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=1744361628; cv=none; d=zohomail.com; s=zohoarc; b=GXw3KbuCAJvSfp2d3C1tIwM1+HSeznxupqJAkXVZR+sZkfE7EVAceVAj1i1Sqh8xLFPZWjX+On2LEH6Iegdjn0Y9wLvApa9t1hSIbM8XOIw/9PyaylqggHqWHu4fmjld1KHv2Y2Eceo9LO0v8hO+AEhQmB22BE4bmhANoHk/i1I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361628; 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=1MJO33h08GE60V6bLEiUEHlZaWjO09OnGNPdPAk5FWo=; b=j4yx7JOi76opF/Rh8vrPk4YyJ9x7eNLCV5u5d3S9HfOhCbwHMv6X8B/v0abufWurxtW7GoWuC9/ZInqmFmh+Un7XI/sgAhA9iWbZCBhNf/HslJ6VOriLxpLfm0YEUy6IFSdae8Wm4Ir8olwXSMCu9y2NiNvZ1Jw9Pr6YCVkBMII= 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 1744361628894258.4765180719345; Fri, 11 Apr 2025 01:53:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39Nn-0001tH-5H; Fri, 11 Apr 2025 04:05:03 -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 1u39Nk-0001t6-E8 for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:05:00 -0400 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39Ni-0004il-Jj for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:05:00 -0400 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-2260c91576aso14244155ad.3 for ; Fri, 11 Apr 2025 01:04:58 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.04.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:04:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358697; x=1744963497; 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=1MJO33h08GE60V6bLEiUEHlZaWjO09OnGNPdPAk5FWo=; b=XCrNJgXsiS9anr0eZXpG8llWAKn/ym6dB5uBUYAAVBndu4jI/IkHCSWXYO1nfFExJw eUlSvkEMejiMMNZ5zdH2bZhc5ZuCKeKYG9j8gG8xPScpsf4tfqUCMn8REz640CdOGvBw XHh9pUjdezhMSVvP8M/aItlLtlH9ygSzNv0huh3PQv7ptxYyf3EdqKl5EhomZae7OJX0 aNKTwvdply656bidtZiNRLvq5v8QsbGzeUFFqJhOj73uZNfQlRzL9SmRR+A6OxVxfK5i xtYBSPYRNGKgkWA+aLo+AXJVtSEX3RydUADj2dZWodXXtBErVD+1lh1UOJIHLWpgAYV6 1Pow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358697; x=1744963497; 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=1MJO33h08GE60V6bLEiUEHlZaWjO09OnGNPdPAk5FWo=; b=EggSV2U5Gpiu6W2DCNQpv/ev5lTjLSMANB48C6akDYbG8o2S9etPAjBshurAitOYop rMp5ShrOLwQTWFQMfhh6JnR+3QaxISguC+EV3IKjW1L48ljHMbiTJFnsTANfRyI+vhH7 HtablSaJzUpPCHXUxqfBEoyh+/FKSJqOgx00g+861SRk/5iwr/tkRYDhnEe2ksM88SSV t2cfog6sC7OkWqdtqWS4q5z6PuNqQASjI4TYTvS6WKU1ZvQe7MyJ4WcohSBeXeRTLzU6 XxCJvU7peXXhvtiIwpXdptX4aiwIxHZ5noUMgV5GM+Wuh+cjbhM67oK19ZLMWIMV20dz Rdeg== X-Forwarded-Encrypted: i=1; AJvYcCU4k06ik5eiseIRuRHxWcv8MkS1D502fXh7fpzB2iqNji+bkh/uYK4FD2ENTfPkAlgM9wabmypNXf33@nongnu.org X-Gm-Message-State: AOJu0Ywwe/rhcUstuBoBS1r25TFnPLXxjPbaLqLp63GpAGtGVv09TWqa ld+6Uzu7Kboq9pCLsvFbJMldaWgENBkwxejLb6//qQ6Pi6RhryVb4REsjA== X-Gm-Gg: ASbGncv+PajrAQKyG4ZdvaMFfd0ib6PB43GFq8cGuUeyIeGJWD5k85L3yqJyT1VzrnY 7znWQUFDl/y22xvSrkcqdNw1Js4YepNYxmjYhdPvaIx8SM4qQRSwwxlhDn2BXSgWHxQxyrV0B6k 730VL/XuAIMRv6NxfocaJFauJW8TC5KYTmtR8bTSs2jUZfXHptN9huJ9fytZ1eh/soNjmuiPrua DmAvLfSkcRoHVHZbOhKfmZthrtxwPCL1tKQZsWoKwD19P7S6e3WQ5oAqWqJ0/SA9FaSsTJhs0dA jXVLi0xwPkR+r4KU2M8hF/nLmCW3LeRG7n8B39nQN4hD X-Google-Smtp-Source: AGHT+IG3DXCThWYR8TdW8CRGUpS3CEO1RnPTPANrnjrrLRNgrly5MiX55Q3+387wAPqSxsj0CwED/w== X-Received: by 2002:a17:903:11c8:b0:224:255b:c932 with SMTP id d9443c01a7336-22bea496003mr23405635ad.3.1744358697233; Fri, 11 Apr 2025 01:04:57 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 07/10] usb/msd: Add some additional assertions Date: Fri, 11 Apr 2025 18:04:28 +1000 Message-ID: <20250411080431.207579-8-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::62b; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62b.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: 1744361632022019100 Content-Type: text/plain; charset="utf-8" Add more assertions to help verify internal logic. Signed-off-by: Nicholas Piggin Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- 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 a9d8d4e8618..3b806872587 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -264,13 +264,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; @@ -288,6 +299,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); @@ -486,7 +501,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 Tue Apr 15 23:49:03 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=1744360687; cv=none; d=zohomail.com; s=zohoarc; b=DovNZx4/mKzN3EE7Sie3WYBkuXmVNdvGFKtB4Dzgrc/tTpH2vbj5fJGadcoccPCNWZHwwJTY201h2oi/td8sJR6O6QUm0Sl1y1DRLVB3XZM10gbr6+w0Cov4kBvsnXLadQ1n0rd2ms2+CqbimNnWof0oyeg/UwyRh4y2UBwOXEs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744360687; 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=c1qQE4+KO+DjYecgNKHp1lKOfWtIwSyvifooKIpV6dg=; b=nl46BYPH2JNxf00CE9Kq5YUWqilFREqWZZepWSA/L3iacOf1HjqVvk6qhCRFPrkJd14qQrcevJv+JPxpeh/BXoZtqjzlxvZqV9JtcIHi4zqo7yTjutCEHrUnpRK5KEn7tntazPxjFxUSkAQ9f9ukeF88Spau4FStGbL/vh8SLZs= 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 1744360687417860.1064970212317; Fri, 11 Apr 2025 01:38:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39O5-00025x-Fs; Fri, 11 Apr 2025 04:05:29 -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 1u39Nn-0001tk-Iz for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:05:06 -0400 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39Nl-0004j2-Hm for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:05:03 -0400 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-2243803b776so24622145ad.0 for ; Fri, 11 Apr 2025 01:05:01 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.04.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:04:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358700; x=1744963500; 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=c1qQE4+KO+DjYecgNKHp1lKOfWtIwSyvifooKIpV6dg=; b=fyZoA9A/TH8V0YB0YNEJrPG5SpNRXSQGLI/gulZ6WXyDd6l4ogtN2f6Kg2UWEVatey eDCd/sp7zK04O0M4pFIwSBenyF9IewJxQY7BadiySS0IQ9qEEJz+UqSS+Zd0aiAHKtBW oG9bDZZD/tZBPxG9H+n6CKq+7kS+Brb68xv+lesevxoTv7d/EACXGSRAb88eY85bVHwg VQxeXHBAQDHZ7sZ7LS6EqG1HOk9gcLliEl7LrDiE+55CqKbZq4/v2PnCfNrN8QaqF4oy QZC9GEutBpevqTKz3k/a01xt09M9OPKpqx6/3d7cal1ZQV5NB6jAotOKyKmlSXCXpqIZ Ztgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358700; x=1744963500; 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=c1qQE4+KO+DjYecgNKHp1lKOfWtIwSyvifooKIpV6dg=; b=WdPKLk4NMZAneqdufMOIg5jfjZfv5WUHCA8zWO7q93/FbdlrFOzLxqzrL1EVsyrkvt tUWw+FZGPLfTMOZTiFMOvZpupT1cAPgwRf0unviY2g95xAmuvkNO+0BOOS72hbRoIuX5 +YqjD+qP7R1CDayjrJWYpkpwMyCRMm+wC7+pgP7t1aMq4ScdUjMeBEy7+yd4gay1tVeT qKGYb2D+H9BvGS0elSbSWrQkk1ivLRWBG4nm+ZkppqTU2Js61mkp6hHujbQOgyu+RkZH DJaqVvVm3RMC1nvaMMjJmSirbXGdQYRiaWiSfLed2bbqRYBTVcJqivVEuqVzxsnwJLYv pPrg== X-Forwarded-Encrypted: i=1; AJvYcCUSbUXHXF5V29d2mBA1egiJfbtsShl0h5So9tSSPv83NhyOEMDHiQpAKJhwWrLZUca6ERDzEUjgnocb@nongnu.org X-Gm-Message-State: AOJu0YzNsOXXouGYPxd8QJsohhJQoP5FWR/sdchJWT1b73IPclre1t9S 0hfXntpkl3Ql77y6acYIjn84enkHRUjEh+F5ixQMVW+02lx7RGGHwex6HA== X-Gm-Gg: ASbGncuebVKP6ttuoQ58v81Rw0XkgoIh6hkz0TjVeWBwSgFn9onKRrs5f+zyn2FOzmO tCElbKX70CTpuiVYAeCv+mBnQ2MPSFJ6KuJLOOtPMx5XZR0OLpzOodEDNKUfRMy+tUnK/XxBERy 8dJbDhZjLAHKdoT78KhVy8SiCv7XXwWaUx5xHjERIhBHhCRDLiR4Xd3l33x3DjUgud2OkH8LlMW pJA9MoBunqP4hJhJYefRNBkde14ZWfKnIHpRnpOeeO0g0sQLxXDgCaqD9xHtRnMnus3bP/HINdy LkPtCzuCbdhgMUJTHZR09AbD0WFDu3WF8JxnR0tORbYvuoqNoQHLE9U= X-Google-Smtp-Source: AGHT+IEBRbk9WfXhGyEdMB0wLxlZCpyoF/gjqyeFqzM9k58dXZ+iG2ZTfH+vmelmFaww90KfutyKQg== X-Received: by 2002:a17:903:2bce:b0:224:a79:5fe9 with SMTP id d9443c01a7336-22bea4bd2cbmr26768835ad.30.1744358700028; Fri, 11 Apr 2025 01:05:00 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 08/10] usb/msd: Rename mode to cbw_state, and tweak names Date: Fri, 11 Apr 2025 18:04:29 +1000 Message-ID: <20250411080431.207579-9-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::62b; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62b.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: 1744360689975019000 Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Nicholas Piggin Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- include/hw/usb/msd.h | 12 +++++------ hw/usb/dev-storage.c | 50 +++++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/include/hw/usb/msd.h b/include/hw/usb/msd.h index a40d15f5def..c109544f632 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -10,11 +10,11 @@ #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. */ +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. */ }; =20 struct QEMU_PACKED usb_msd_csw { @@ -26,7 +26,7 @@ struct QEMU_PACKED usb_msd_csw { =20 struct MSDState { USBDevice dev; - enum USBMSDMode mode; + enum 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 3b806872587..ed6d9b70b96 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -264,12 +264,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; @@ -301,7 +301,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); @@ -312,7 +312,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); @@ -322,19 +323,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); } @@ -377,7 +378,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; } @@ -478,8 +479,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; } @@ -492,11 +493,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); @@ -513,7 +514,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; @@ -531,7 +532,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; } } } @@ -556,8 +557,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; } @@ -573,7 +574,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; } @@ -585,11 +586,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); @@ -603,11 +604,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; @@ -672,7 +674,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 Tue Apr 15 23:49:03 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=1744361940; cv=none; d=zohomail.com; s=zohoarc; b=jpXs4fzMqGVOoIALP6dm9TD1n9Yu/fwoaAnfgL41hJCnKRGnTCeA47ShilpvKatAuTIqEWDpz/80jOQSTvxXUQT0t5CxuSlFFIGVbKN8R4tVqzj6F3vEve38B2b1nRjD3EE8XDahJZnYlCbr6I9aZ2CYrrJJZAm1zSopGIlNDh0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361940; 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=f5KxXH0aWmL69s5RoVMR+W0a38WA9YGEEu19DsVGYxk=; b=NtZRHjqAnNNJeyQq8DmrNMv0RWDWaZbIX/LWQFQc2M3cSf08x2+0SFAlTcbEwv63qxCWAtLRRTGZZ3W4ZEX0qjsAEza930lcP+3tvQmxU/j3k9uYYPGfmnLxfW+wVd1joRqz9Uprxx4hDS2N/5lJtd+9iTOTEzlFDIsOjo3y68g= 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 1744361940341668.4923179735031; Fri, 11 Apr 2025 01:59:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39OI-0002Kq-5V; Fri, 11 Apr 2025 04:05:34 -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 1u39Nq-0001vf-Fr for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:05:10 -0400 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39No-0004sT-G8 for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:05:06 -0400 Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-227c7e57da2so15886185ad.0 for ; Fri, 11 Apr 2025 01:05:04 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.05.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:05:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358703; x=1744963503; 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=f5KxXH0aWmL69s5RoVMR+W0a38WA9YGEEu19DsVGYxk=; b=g9d/mW+Js5fO8/dWGPxDAl6FGeirjkVw8lmizsnsC4wzv8CoWeVP4pdNpfk+Qu6nLQ nNm0rtXHV8/ITX/gsrRGLxfHfoSzFQmItH45hhVqi9fMuQwlidi8cQ3zC07Z91xL/p6p 3dWYb4VFS9Jd8x5bpp86nbMRVYryKPV/HwmlZNNwmwFVMIMBbo+U2SldmJO2Lj27xx8R KMkm6HuagETjFWb3+StusA06XOTIFoImgmZDk2zf3MZhmZJ7vR3XY1SXzx11ihvK6YY6 PxlklANpEYjFCik22A3RzSJpymhfW3UKs0PyouegvWNNiMVGSRWZdzb7tp395me1PYbV HulQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358703; x=1744963503; 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=f5KxXH0aWmL69s5RoVMR+W0a38WA9YGEEu19DsVGYxk=; b=cUCpCZdpLWkvzMauh4tH5FXb2SjMgVleDAwKt4rPkGUhqabYAZe3FmmsL9TmWaUHCT gGIgkQoAfR4LS9BIiQoylUQ/e0qHp5raG4bEqU/cjTbQ+URHMjFxk+9EbRHTH8neC63r L7u2ZFJlHMOpufdUt4n+fwbXi9swNUg/8E3U6Q7LiHmXOzNLKY2hX6jOt+Z70JRSCaBH vMrVwIFXefAK/8zffxDq9qDdmuGhVxyT8DVBmg7SR6wPHShMiYOsDtLCA75A2W9LfUM8 +evXkFGLClzG4K005rHBYBi1CpOk7k0ZXCFrymojC+5fdT32ATI9PatQAbMcsvqxa3Xn EFZg== X-Forwarded-Encrypted: i=1; AJvYcCWqqpy5c+FxNCjvMj6b1Zu7IsqTqIbR0Ybn8JMxKJtpomD6T+yRuXonQwZKvtJUiV0qJLAipXbsw5TP@nongnu.org X-Gm-Message-State: AOJu0YzmAlb52DByQof2rOIG9lPe+2ibvK6QFGnuma1peeO+SkMkdnLa K0D1q3+brRGd5LIm9s+KDygvHgRggDSe7+Ll56i6ytfD8GLEE43t X-Gm-Gg: ASbGnctJFMN2wokl2Jb3ETYrq2qoMewAeFT69WkeNTxll+Gtd1JAxBIKfvtDOmOuzm/ os24Ar5RaxwnHOKWQcg9W77O/byqMEnhe0LzwW0Upa+HVTbcsYyVBig1BbUZEqehuApEoIaOPHz 1+URJFDZq5HtD64VUpEAhBrCCKFr3vy2/xD9qWj/od0S7a1LYvfkGAUhCyB6bGcyj/hOaVbAP/i 6lzwf7gjuvxFDOx1ABmGKOvk761ReatmHVNSHAmDJYX96BGQKd33LbQMy8f2gwxn0s+EHVYhOeu gjBDjONDhI/FA1/DSwiuA7KVfb3IC/avC/zrtu+h4MUl X-Google-Smtp-Source: AGHT+IEX/FmRf3+ZO6sq+btnGS5rQwl0BCUH3yCme49cIkgzVI3YfQAQ50/sggV6fDycEB3Gm3JfgA== X-Received: by 2002:a17:902:c945:b0:21f:4c8b:c514 with SMTP id d9443c01a7336-22bea5027ecmr25382585ad.45.1744358702847; Fri, 11 Apr 2025 01:05:02 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 09/10] usb/msd: Permit a DATA-IN or CSW packet before CBW packet Date: Fri, 11 Apr 2025 18:04:30 +1000 Message-ID: <20250411080431.207579-10-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::62e; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62e.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: 1744361942502019100 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 c109544f632..2ed3664b31d 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -37,6 +37,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 ed6d9b70b96..654b9071d33 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -436,6 +436,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(); } @@ -499,6 +501,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); @@ -516,6 +531,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; } @@ -558,7 +578,22 @@ 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_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; } @@ -575,6 +610,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 DATAOUT state"); + goto fail; + } if (!check_valid_csw(p)) { goto fail; } @@ -592,6 +631,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 Tue Apr 15 23:49:03 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=1744361114; cv=none; d=zohomail.com; s=zohoarc; b=nr5f327FjfrcJHW1JGzhw1167P7akNDvhrRp3v8fSLjc/lZwW5jy2ED49HG+iEuMCSKYM6Y6BY4iHl8+CnKmRdRFrEorM5HyXvreygX9+PGUVdQjFOoqmagYjvZxGAiaVGMKd3upYlTQwayBCtAOmrOwHv3twP/GML5qQ0SBo5s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744361114; 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=bakV1Nw41aQ2qXglXOF8Xs81TCloe9+HZ+gP072wOBQ=; b=lbwy/5wcMZj5cZJW65FO03DtIhYFYS65sfPkP+OZSHksaqEFONr/g+fHGb/PZk+riYqiNIU8SGCa+KC5ZJSyuRwhsoq39KGZS34FYPEUHhswm3zYNK1KC7tDq3rIeog/222gctU5xVKyz2Oe5mtH/qqlLnhuS0b442JDa+8kNSY= 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 1744361114847146.11776396590153; Fri, 11 Apr 2025 01:45:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u39OL-0002Sv-KY; Fri, 11 Apr 2025 04:05:37 -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 1u39Nu-0001xp-7V for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:05:11 -0400 Received: from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u39Nr-0004uY-7b for qemu-devel@nongnu.org; Fri, 11 Apr 2025 04:05:09 -0400 Received: by mail-pj1-x1031.google.com with SMTP id 98e67ed59e1d1-301918a4e3bso1763321a91.3 for ; Fri, 11 Apr 2025 01:05:06 -0700 (PDT) Received: from wheely.local0.net ([220.253.99.94]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7c95c83sm43048065ad.147.2025.04.11.01.05.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Apr 2025 01:05:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744358705; x=1744963505; 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=bakV1Nw41aQ2qXglXOF8Xs81TCloe9+HZ+gP072wOBQ=; b=CmkzWPCQvoCVUGx/gldFqZnjcAWsjowYsM/LcL2g8ehaEtPHN50k707M5TEYoOaN/O BplnhNU8CLvYaJVl8XX9XG9D5ujiDRhiG/GoTGOaOthozdPNaQVgjdVRvUsBGCt+12YM FkCi6ylKUk8PlGHeOeX+9jIU4U0Rh5CX1HaVNGl+xAAni/JIRF3BrmP/DRKs/kTRu38y prNIzNIhAPgyu/F28342pnTgLUrueGv6l5xpQydtl53LIctWImTn0CFtOLQhpLCMw5Zs tOP2o9MwxPUrAemC5KlwDyGkzLd6ocqTDauoZR5Di+NeQy+gCNRTKc/U7JgvpLtJHhUJ d09g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744358705; x=1744963505; 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=bakV1Nw41aQ2qXglXOF8Xs81TCloe9+HZ+gP072wOBQ=; b=edZ0K5RjHXkztKpbxaT2fk55VTesKH2OlxNTzOtCUJnEFaWgkQFxk1yTXp6yMnHyV8 IWRAEiw6XunbYP06061dmTCp516c3+xGoRw2cG5xnqK8e91K1SM+i7XqqSSKfDWqWI7w /JW6luGczN2kiBzM3a3/yzp8WzDKgEmgT7BkCluz8RymNXoudR0VanLzbLqmD5EASvOC IsE6wuHJJpOR47y6c1OULZ5cmut3H0R0UPVLPODeyWwvBrx3rpWpMZqrzyqPHCIW5p7/ obhSDh04LxlR21iargkx40ZmNT3f5PxKR2wljM7SVNrDcj3PXAkzTyXukNHXv+jRimlr oAdA== X-Forwarded-Encrypted: i=1; AJvYcCVodIskQ2aF7wt9pR0ZjOK4QXL6V/ms5/7PcKm2lAsfXsDzEl0nA/4iL4zbWC8cPiuCF7ulO07bBN+u@nongnu.org X-Gm-Message-State: AOJu0YygXRlCje27VmgiHV0b2UcLPTvvr4wnth3PTYmkDx3UeTtPM4h4 NmQoFqp8Gdsur/dEGCllqpqCAH+Q/A/v7cvIfeHZX5LI8Mxqn/0hVspUpw== X-Gm-Gg: ASbGnct83ePGNrQ7cYWmSi9+D5AkWu/Lq5Ae2/rCqehhkSnOcWw9WdvyQFE+z3+WGil g51oL3t5nwihFIIGiVFQT9F+7Go8rCZxqeymJ/Mgs3LzbQeriKH+xKaVTIZtsN1F3Y6nwevbOKS fnug5UuPRiGWrlqczmTlA6mndz4YISKQl69GGYL3kHWf6t60rAMAJPNbPHjrYNOHTCZVsU35TzV M+a2lVyROm9sQQiDiI3lX32+a3qxwNaBFlv8I5KUIulVUnyNA0O7AeBLNao+M5nSdN5Dyuc4Z3Y aFTpHOJUxc2CYdkvbsVKS+TnquybY01/h80EZG5FuqY6AdOgaSE7Oss= X-Google-Smtp-Source: AGHT+IE3C+EWZzK3AtgZt3ePpWZLTKOy0D3uhMKDhaXC331q5agUzLd/9DQCSF1gEDSOIjZWr+Fyhw== X-Received: by 2002:a17:90b:2f0b:b0:2f6:f32e:90ac with SMTP id 98e67ed59e1d1-30823639726mr3218534a91.11.1744358705563; Fri, 11 Apr 2025 01:05:05 -0700 (PDT) From: Nicholas Piggin To: Gerd Hoffmann Cc: Nicholas Piggin , qemu-devel@nongnu.org, Kevin Wolf Subject: [PATCH v2 10/10] usb/msd: Add more tracing Date: Fri, 11 Apr 2025 18:04:31 +1000 Message-ID: <20250411080431.207579-11-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250411080431.207579-1-npiggin@gmail.com> References: <20250411080431.207579-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::1031; envelope-from=npiggin@gmail.com; helo=mail-pj1-x1031.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: 1744361117636019000 Content-Type: text/plain; charset="utf-8" Add tracing for more received packet types, cbw_state changes, and some more SCSI callbacks. These were useful in debugging relaxed packet ordering support. Signed-off-by: Nicholas Piggin Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/usb/dev-storage.c | 23 +++++++++++++++++++++-- hw/usb/trace-events | 9 ++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 654b9071d33..0ed39de189d 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -187,7 +187,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); @@ -202,7 +202,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); @@ -231,7 +231,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); @@ -264,6 +268,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); @@ -324,11 +330,13 @@ void usb_msd_command_complete(SCSIRequest *req, size_= t resid) } if (s->data_len =3D=3D 0) { s->cbw_state =3D USB_MSD_CBW_CSW; + trace_usb_msd_cbw_state(s->cbw_state); } /* 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; + trace_usb_msd_cbw_state(s->cbw_state); } =20 if (s->cbw_state =3D=3D USB_MSD_CBW_CSW) { @@ -336,6 +344,7 @@ void usb_msd_command_complete(SCSIRequest *req, size_t = resid) if (p) { usb_msd_send_status(s, p); s->cbw_state =3D USB_MSD_CBW_NONE; + trace_usb_msd_cbw_state(s->cbw_state); /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_csw_packet_complete(s, USB_RET_SUCCESS); } @@ -379,6 +388,7 @@ void usb_msd_handle_reset(USBDevice *dev) =20 memset(&s->csw, 0, sizeof(s->csw)); s->cbw_state =3D USB_MSD_CBW_NONE; + trace_usb_msd_cbw_state(s->cbw_state); =20 s->needs_reset =3D false; } @@ -429,6 +439,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) { @@ -516,6 +528,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); + trace_usb_msd_cbw_state(s->cbw_state); assert(le32_to_cpu(s->csw.residue) =3D=3D 0); assert(s->scsi_len =3D=3D 0); s->req =3D scsi_req_new(scsi_dev, tag, cbw.lun, @@ -553,6 +566,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; + trace_usb_msd_cbw_state(s->cbw_state); } } } @@ -579,6 +593,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) =20 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"); @@ -590,6 +605,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) break; =20 case USB_MSD_CBW_DATAOUT: + trace_usb_msd_csw_in(); if (s->unknown_in_packet) { error_report("usb-msd: unknown_in_packet in DATAOUT state"); goto fail; @@ -610,6 +626,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 DATAOUT state"); goto fail; @@ -626,6 +643,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) } else { usb_msd_send_status(s, p); s->cbw_state =3D USB_MSD_CBW_NONE; + trace_usb_msd_cbw_state(s->cbw_state); } break; =20 @@ -648,6 +666,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; + trace_usb_msd_cbw_state(s->cbw_state); } } } diff --git a/hw/usb/trace-events b/hw/usb/trace-events index dd04f14add1..688f7ba0b3d 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -264,12 +264,19 @@ 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_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_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