| /* |
| * USB Mass Storage Device emulation |
| * |
| * Copyright (c) 2006 CodeSourcery. |
| * Written by Paul Brook |
| * |
| * This code is licensed under the LGPL. |
| */ |
| |
| #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. */ |
| }; |
| |
| 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); |