xref: /qemu/include/hw/usb/msd.h (revision bbd8323d3196c9979385cba1b8b38859836e63c3)
1*bbd8323dSGerd Hoffmann /*
2*bbd8323dSGerd Hoffmann  * USB Mass Storage Device emulation
3*bbd8323dSGerd Hoffmann  *
4*bbd8323dSGerd Hoffmann  * Copyright (c) 2006 CodeSourcery.
5*bbd8323dSGerd Hoffmann  * Written by Paul Brook
6*bbd8323dSGerd Hoffmann  *
7*bbd8323dSGerd Hoffmann  * This code is licensed under the LGPL.
8*bbd8323dSGerd Hoffmann  */
9*bbd8323dSGerd Hoffmann 
10*bbd8323dSGerd Hoffmann #include "hw/usb.h"
11*bbd8323dSGerd Hoffmann #include "hw/scsi/scsi.h"
12*bbd8323dSGerd Hoffmann 
13*bbd8323dSGerd Hoffmann enum USBMSDMode {
14*bbd8323dSGerd Hoffmann     USB_MSDM_CBW, /* Command Block.  */
15*bbd8323dSGerd Hoffmann     USB_MSDM_DATAOUT, /* Transfer data to device.  */
16*bbd8323dSGerd Hoffmann     USB_MSDM_DATAIN, /* Transfer data from device.  */
17*bbd8323dSGerd Hoffmann     USB_MSDM_CSW /* Command Status.  */
18*bbd8323dSGerd Hoffmann };
19*bbd8323dSGerd Hoffmann 
20*bbd8323dSGerd Hoffmann struct usb_msd_csw {
21*bbd8323dSGerd Hoffmann     uint32_t sig;
22*bbd8323dSGerd Hoffmann     uint32_t tag;
23*bbd8323dSGerd Hoffmann     uint32_t residue;
24*bbd8323dSGerd Hoffmann     uint8_t status;
25*bbd8323dSGerd Hoffmann };
26*bbd8323dSGerd Hoffmann 
27*bbd8323dSGerd Hoffmann struct MSDState {
28*bbd8323dSGerd Hoffmann     USBDevice dev;
29*bbd8323dSGerd Hoffmann     enum USBMSDMode mode;
30*bbd8323dSGerd Hoffmann     uint32_t scsi_off;
31*bbd8323dSGerd Hoffmann     uint32_t scsi_len;
32*bbd8323dSGerd Hoffmann     uint32_t data_len;
33*bbd8323dSGerd Hoffmann     struct usb_msd_csw csw;
34*bbd8323dSGerd Hoffmann     SCSIRequest *req;
35*bbd8323dSGerd Hoffmann     SCSIBus bus;
36*bbd8323dSGerd Hoffmann     /* For async completion.  */
37*bbd8323dSGerd Hoffmann     USBPacket *packet;
38*bbd8323dSGerd Hoffmann     /* usb-storage only */
39*bbd8323dSGerd Hoffmann     BlockConf conf;
40*bbd8323dSGerd Hoffmann     bool removable;
41*bbd8323dSGerd Hoffmann     bool commandlog;
42*bbd8323dSGerd Hoffmann     SCSIDevice *scsi_dev;
43*bbd8323dSGerd Hoffmann };
44*bbd8323dSGerd Hoffmann 
45*bbd8323dSGerd Hoffmann typedef struct MSDState MSDState;
46*bbd8323dSGerd Hoffmann #define TYPE_USB_STORAGE "usb-storage-dev"
47*bbd8323dSGerd Hoffmann DECLARE_INSTANCE_CHECKER(MSDState, USB_STORAGE_DEV,
48*bbd8323dSGerd Hoffmann                          TYPE_USB_STORAGE)
49*bbd8323dSGerd Hoffmann 
50*bbd8323dSGerd Hoffmann void usb_msd_transfer_data(SCSIRequest *req, uint32_t len);
51*bbd8323dSGerd Hoffmann void usb_msd_command_complete(SCSIRequest *req, size_t resid);
52*bbd8323dSGerd Hoffmann void usb_msd_request_cancelled(SCSIRequest *req);
53*bbd8323dSGerd Hoffmann void *usb_msd_load_request(QEMUFile *f, SCSIRequest *req);
54*bbd8323dSGerd Hoffmann void usb_msd_handle_reset(USBDevice *dev);
55