| /* | |
| * USB Mass Storage Device emulation | |
| * | |
| * Copyright (c) 2006 CodeSourcery. | |
| * Written by Paul Brook | |
| * | |
| * This code is licensed under the LGPL. | |
| */ | |
| #include "hw/usb/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. */ | |
| }; | |
| struct QEMU_PACKED usb_msd_csw { | |
| uint32_t sig; | |
| uint32_t tag; | |
| uint32_t residue; | |
| uint8_t status; | |
| }; | |
| struct MSDState { | |
| USBDevice dev; | |
| enum USBMSDMode mode; | |
| uint32_t scsi_off; | |
| uint32_t scsi_len; | |
| uint32_t data_len; | |
| struct usb_msd_csw csw; | |
| SCSIRequest *req; | |
| SCSIBus bus; | |
| /* For async completion. */ | |
| USBPacket *packet; | |
| /* usb-storage only */ | |
| BlockConf conf; | |
| bool removable; | |
| bool commandlog; | |
| SCSIDevice *scsi_dev; | |
| bool needs_reset; | |
| }; | |
| typedef struct MSDState MSDState; | |
| #define TYPE_USB_STORAGE "usb-storage-dev" | |
| DECLARE_INSTANCE_CHECKER(MSDState, USB_STORAGE_DEV, | |
| TYPE_USB_STORAGE) | |
| void usb_msd_transfer_data(SCSIRequest *req, uint32_t len); | |
| void usb_msd_command_complete(SCSIRequest *req, size_t resid); | |
| void usb_msd_request_cancelled(SCSIRequest *req); | |
| void *usb_msd_load_request(QEMUFile *f, SCSIRequest *req); | |
| void usb_msd_handle_reset(USBDevice *dev); |