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