On 11/4/25 10:04, Nicholas Piggin wrote:
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 <npig...@gmail.com>
---
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"
-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. */
Since modifying this, please add
typedef
+enum USBMSDCBWState {
+ USB_MSD_CBW_NONE, /* Ready, waiting for CBW packet. */
+ USB_MSD_CBW_DATAOUT, /* Expecting DATA-OUT (to device) packet */
+ USB_MSD_CBW_DATAIN, /* Expecting DATA-IN (from device) packet */
+ USB_MSD_CBW_CSW /* No more data, expecting CSW packet. */
}
USBMSDCBWState;
struct QEMU_PACKED usb_msd_csw {
@@ -26,7 +26,7 @@ struct QEMU_PACKED usb_msd_csw {
struct MSDState {
USBDevice dev;
- enum USBMSDMode mode;
+ enum USBMSDCBWState cbw_state;
USBMSDCBWState cbw_state;
uint32_t scsi_off;
uint32_t scsi_len;
uint32_t data_len;