From nobody Wed Apr 16 04:22:10 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