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