Gerd Hoffmann | 1e37607 | 2009-11-26 15:33:47 +0100 | [diff] [blame] | 1 | #ifndef QEMU_HW_SCSI_H |
| 2 | #define QEMU_HW_SCSI_H |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 3 | |
| 4 | #include "qdev.h" |
Paolo Bonzini | 737e150 | 2012-12-17 18:19:44 +0100 | [diff] [blame] | 5 | #include "block/block.h" |
Markus Armbruster | 31e404f | 2012-07-11 15:08:36 +0200 | [diff] [blame] | 6 | #include "hw/block-common.h" |
Paolo Bonzini | 9c17d61 | 2012-12-17 18:20:04 +0100 | [diff] [blame] | 7 | #include "sysemu/sysemu.h" |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 8 | |
Markus Armbruster | 27d6bf4 | 2011-01-28 11:21:40 +0100 | [diff] [blame] | 9 | #define MAX_SCSI_DEVS 255 |
| 10 | |
Gerd Hoffmann | 29362eb | 2009-11-26 15:33:51 +0100 | [diff] [blame] | 11 | #define SCSI_CMD_BUF_SIZE 16 |
| 12 | |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 13 | typedef struct SCSIBus SCSIBus; |
Paolo Bonzini | afd4030 | 2011-08-13 15:44:45 +0200 | [diff] [blame] | 14 | typedef struct SCSIBusInfo SCSIBusInfo; |
Paolo Bonzini | 2599aec | 2011-08-03 10:49:11 +0200 | [diff] [blame] | 15 | typedef struct SCSICommand SCSICommand; |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 16 | typedef struct SCSIDevice SCSIDevice; |
Hannes Reinecke | 5c6c0e5 | 2011-04-18 12:35:39 +0200 | [diff] [blame] | 17 | typedef struct SCSIRequest SCSIRequest; |
Paolo Bonzini | 8dbd457 | 2011-08-03 10:49:08 +0200 | [diff] [blame] | 18 | typedef struct SCSIReqOps SCSIReqOps; |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 19 | |
Gerd Hoffmann | 97a0643 | 2009-11-26 15:33:57 +0100 | [diff] [blame] | 20 | enum SCSIXferMode { |
| 21 | SCSI_XFER_NONE, /* TEST_UNIT_READY, ... */ |
| 22 | SCSI_XFER_FROM_DEV, /* READ, INQUIRY, MODE_SENSE, ... */ |
| 23 | SCSI_XFER_TO_DEV, /* WRITE, MODE_SELECT, ... */ |
| 24 | }; |
| 25 | |
Hannes Reinecke | a1f0cce | 2011-04-18 12:53:14 +0200 | [diff] [blame] | 26 | typedef struct SCSISense { |
| 27 | uint8_t key; |
| 28 | uint8_t asc; |
| 29 | uint8_t ascq; |
| 30 | } SCSISense; |
| 31 | |
Paolo Bonzini | b45ef67 | 2011-08-03 10:49:07 +0200 | [diff] [blame] | 32 | #define SCSI_SENSE_BUF_SIZE 96 |
| 33 | |
Paolo Bonzini | 2599aec | 2011-08-03 10:49:11 +0200 | [diff] [blame] | 34 | struct SCSICommand { |
| 35 | uint8_t buf[SCSI_CMD_BUF_SIZE]; |
| 36 | int len; |
| 37 | size_t xfer; |
| 38 | uint64_t lba; |
| 39 | enum SCSIXferMode mode; |
| 40 | }; |
| 41 | |
Hannes Reinecke | 5c6c0e5 | 2011-04-18 12:35:39 +0200 | [diff] [blame] | 42 | struct SCSIRequest { |
Gerd Hoffmann | 4c41d2e | 2009-11-26 15:33:48 +0100 | [diff] [blame] | 43 | SCSIBus *bus; |
| 44 | SCSIDevice *dev; |
Paolo Bonzini | adcf275 | 2011-10-12 12:57:59 +0200 | [diff] [blame] | 45 | const SCSIReqOps *ops; |
Paolo Bonzini | ad2d30f | 2011-04-18 16:01:56 +0200 | [diff] [blame] | 46 | uint32_t refcount; |
Gerd Hoffmann | 4c41d2e | 2009-11-26 15:33:48 +0100 | [diff] [blame] | 47 | uint32_t tag; |
Gerd Hoffmann | 89b08ae | 2009-11-26 15:33:50 +0100 | [diff] [blame] | 48 | uint32_t lun; |
Gerd Hoffmann | ed3a34a | 2009-11-26 15:34:00 +0100 | [diff] [blame] | 49 | uint32_t status; |
Paolo Bonzini | 01e9545 | 2011-07-06 11:55:37 +0200 | [diff] [blame] | 50 | size_t resid; |
Paolo Bonzini | 2599aec | 2011-08-03 10:49:11 +0200 | [diff] [blame] | 51 | SCSICommand cmd; |
Gerd Hoffmann | 4c41d2e | 2009-11-26 15:33:48 +0100 | [diff] [blame] | 52 | BlockDriverAIOCB *aiocb; |
Paolo Bonzini | 3d5aba9 | 2011-07-06 11:26:47 +0200 | [diff] [blame] | 53 | QEMUSGList *sg; |
| 54 | bool dma_started; |
Paolo Bonzini | b45ef67 | 2011-08-03 10:49:07 +0200 | [diff] [blame] | 55 | uint8_t sense[SCSI_SENSE_BUF_SIZE]; |
| 56 | uint32_t sense_len; |
Jan Kiszka | e8637c9 | 2010-07-13 14:13:45 +0200 | [diff] [blame] | 57 | bool enqueued; |
Paolo Bonzini | e88c591 | 2011-10-25 12:53:33 +0200 | [diff] [blame] | 58 | bool io_canceled; |
Paolo Bonzini | 71544d3 | 2011-10-25 12:53:36 +0200 | [diff] [blame] | 59 | bool retry; |
Hannes Reinecke | c5bf71a | 2011-07-11 15:02:24 +0200 | [diff] [blame] | 60 | void *hba_private; |
Gerd Hoffmann | 9af99d9 | 2009-11-26 15:33:49 +0100 | [diff] [blame] | 61 | QTAILQ_ENTRY(SCSIRequest) next; |
Hannes Reinecke | 5c6c0e5 | 2011-04-18 12:35:39 +0200 | [diff] [blame] | 62 | }; |
Gerd Hoffmann | 4c41d2e | 2009-11-26 15:33:48 +0100 | [diff] [blame] | 63 | |
Anthony Liguori | b9eea3e | 2011-12-15 14:50:08 -0600 | [diff] [blame] | 64 | #define TYPE_SCSI_DEVICE "scsi-device" |
| 65 | #define SCSI_DEVICE(obj) \ |
| 66 | OBJECT_CHECK(SCSIDevice, (obj), TYPE_SCSI_DEVICE) |
| 67 | #define SCSI_DEVICE_CLASS(klass) \ |
| 68 | OBJECT_CLASS_CHECK(SCSIDeviceClass, (klass), TYPE_SCSI_DEVICE) |
| 69 | #define SCSI_DEVICE_GET_CLASS(obj) \ |
| 70 | OBJECT_GET_CLASS(SCSIDeviceClass, (obj), TYPE_SCSI_DEVICE) |
| 71 | |
| 72 | typedef struct SCSIDeviceClass { |
| 73 | DeviceClass parent_class; |
| 74 | int (*init)(SCSIDevice *dev); |
| 75 | void (*destroy)(SCSIDevice *s); |
| 76 | SCSIRequest *(*alloc_req)(SCSIDevice *s, uint32_t tag, uint32_t lun, |
| 77 | uint8_t *buf, void *hba_private); |
| 78 | void (*unit_attention_reported)(SCSIDevice *s); |
| 79 | } SCSIDeviceClass; |
| 80 | |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 81 | struct SCSIDevice |
| 82 | { |
| 83 | DeviceState qdev; |
Paolo Bonzini | 71544d3 | 2011-10-25 12:53:36 +0200 | [diff] [blame] | 84 | VMChangeStateEntry *vmsentry; |
| 85 | QEMUBH *bh; |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 86 | uint32_t id; |
Christoph Hellwig | 428c149 | 2010-02-10 23:37:09 +0100 | [diff] [blame] | 87 | BlockConf conf; |
Paolo Bonzini | 6dc06f0 | 2011-08-03 10:49:17 +0200 | [diff] [blame] | 88 | SCSISense unit_attention; |
Paolo Bonzini | 3653d8c | 2011-09-13 16:19:53 +0200 | [diff] [blame] | 89 | bool sense_is_ua; |
Paolo Bonzini | b45ef67 | 2011-08-03 10:49:07 +0200 | [diff] [blame] | 90 | uint8_t sense[SCSI_SENSE_BUF_SIZE]; |
| 91 | uint32_t sense_len; |
Gerd Hoffmann | 9af99d9 | 2009-11-26 15:33:49 +0100 | [diff] [blame] | 92 | QTAILQ_HEAD(, SCSIRequest) requests; |
Paolo Bonzini | 0d3545e | 2011-07-27 23:24:50 +0200 | [diff] [blame] | 93 | uint32_t channel; |
Paolo Bonzini | 87dcd1b | 2011-08-03 10:49:12 +0200 | [diff] [blame] | 94 | uint32_t lun; |
Gerd Hoffmann | b07995e | 2009-11-26 15:33:52 +0100 | [diff] [blame] | 95 | int blocksize; |
Gerd Hoffmann | 9137665 | 2009-11-26 15:33:54 +0100 | [diff] [blame] | 96 | int type; |
Paolo Bonzini | 7877903 | 2011-10-13 10:39:50 +0200 | [diff] [blame] | 97 | uint64_t max_lba; |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 98 | }; |
| 99 | |
Paolo Bonzini | 63f740d | 2011-12-02 16:27:02 +0100 | [diff] [blame] | 100 | extern const VMStateDescription vmstate_scsi_device; |
| 101 | |
| 102 | #define VMSTATE_SCSI_DEVICE(_field, _state) { \ |
| 103 | .name = (stringify(_field)), \ |
| 104 | .size = sizeof(SCSIDevice), \ |
| 105 | .vmsd = &vmstate_scsi_device, \ |
| 106 | .flags = VMS_STRUCT, \ |
| 107 | .offset = vmstate_offset_value(_state, _field, SCSIDevice), \ |
| 108 | } |
| 109 | |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 110 | /* cdrom.c */ |
| 111 | int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track); |
| 112 | int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num); |
| 113 | |
| 114 | /* scsi-bus.c */ |
Paolo Bonzini | 8dbd457 | 2011-08-03 10:49:08 +0200 | [diff] [blame] | 115 | struct SCSIReqOps { |
| 116 | size_t size; |
Paolo Bonzini | 12010e7 | 2011-08-03 10:49:09 +0200 | [diff] [blame] | 117 | void (*free_req)(SCSIRequest *req); |
| 118 | int32_t (*send_command)(SCSIRequest *req, uint8_t *buf); |
| 119 | void (*read_data)(SCSIRequest *req); |
| 120 | void (*write_data)(SCSIRequest *req); |
| 121 | void (*cancel_io)(SCSIRequest *req); |
| 122 | uint8_t *(*get_buf)(SCSIRequest *req); |
Paolo Bonzini | 63f740d | 2011-12-02 16:27:02 +0100 | [diff] [blame] | 123 | |
| 124 | void (*save_request)(QEMUFile *f, SCSIRequest *req); |
| 125 | void (*load_request)(QEMUFile *f, SCSIRequest *req); |
Paolo Bonzini | 8dbd457 | 2011-08-03 10:49:08 +0200 | [diff] [blame] | 126 | }; |
| 127 | |
Paolo Bonzini | afd4030 | 2011-08-13 15:44:45 +0200 | [diff] [blame] | 128 | struct SCSIBusInfo { |
Paolo Bonzini | 7e0380b | 2011-08-13 18:55:17 +0200 | [diff] [blame] | 129 | int tcq; |
Paolo Bonzini | 0d3545e | 2011-07-27 23:24:50 +0200 | [diff] [blame] | 130 | int max_channel, max_target, max_lun; |
Paolo Bonzini | c6df710 | 2011-04-22 12:27:30 +0200 | [diff] [blame] | 131 | void (*transfer_data)(SCSIRequest *req, uint32_t arg); |
Paolo Bonzini | 01e9545 | 2011-07-06 11:55:37 +0200 | [diff] [blame] | 132 | void (*complete)(SCSIRequest *req, uint32_t arg, size_t resid); |
Paolo Bonzini | 94d3f98 | 2011-04-18 22:53:08 +0200 | [diff] [blame] | 133 | void (*cancel)(SCSIRequest *req); |
Cong Meng | 350e6e4 | 2012-06-20 14:47:10 +0800 | [diff] [blame] | 134 | void (*hotplug)(SCSIBus *bus, SCSIDevice *dev); |
| 135 | void (*hot_unplug)(SCSIBus *bus, SCSIDevice *dev); |
Paolo Bonzini | 53200fa | 2012-07-16 14:22:36 +0200 | [diff] [blame] | 136 | void (*change)(SCSIBus *bus, SCSIDevice *dev, SCSISense sense); |
Paolo Bonzini | 3d5aba9 | 2011-07-06 11:26:47 +0200 | [diff] [blame] | 137 | QEMUSGList *(*get_sg_list)(SCSIRequest *req); |
Paolo Bonzini | 63f740d | 2011-12-02 16:27:02 +0100 | [diff] [blame] | 138 | |
| 139 | void (*save_request)(QEMUFile *f, SCSIRequest *req); |
| 140 | void *(*load_request)(QEMUFile *f, SCSIRequest *req); |
Paolo Bonzini | 8e86b93 | 2012-07-09 12:06:28 +0200 | [diff] [blame] | 141 | void (*free_request)(SCSIBus *bus, void *priv); |
Paolo Bonzini | cfdc1bb | 2011-04-18 17:11:14 +0200 | [diff] [blame] | 142 | }; |
| 143 | |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 144 | #define TYPE_SCSI_BUS "SCSI" |
| 145 | #define SCSI_BUS(obj) OBJECT_CHECK(SCSIBus, (obj), TYPE_SCSI_BUS) |
| 146 | |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 147 | struct SCSIBus { |
| 148 | BusState qbus; |
| 149 | int busnr; |
| 150 | |
Paolo Bonzini | 6dc06f0 | 2011-08-03 10:49:17 +0200 | [diff] [blame] | 151 | SCSISense unit_attention; |
Paolo Bonzini | afd4030 | 2011-08-13 15:44:45 +0200 | [diff] [blame] | 152 | const SCSIBusInfo *info; |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 153 | }; |
| 154 | |
Paolo Bonzini | afd4030 | 2011-08-13 15:44:45 +0200 | [diff] [blame] | 155 | void scsi_bus_new(SCSIBus *bus, DeviceState *host, const SCSIBusInfo *info); |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 156 | |
| 157 | static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d) |
| 158 | { |
| 159 | return DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus); |
| 160 | } |
| 161 | |
Stefan Hajnoczi | 2d1fd26 | 2011-01-24 15:34:59 +0000 | [diff] [blame] | 162 | SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv, |
Paolo Bonzini | ce4e7e4 | 2011-11-18 16:32:00 +0100 | [diff] [blame] | 163 | int unit, bool removable, int bootindex); |
Markus Armbruster | fa66b90 | 2010-06-25 18:53:21 +0200 | [diff] [blame] | 164 | int scsi_bus_legacy_handle_cmdline(SCSIBus *bus); |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 165 | |
Hannes Reinecke | a1f0cce | 2011-04-18 12:53:14 +0200 | [diff] [blame] | 166 | /* |
| 167 | * Predefined sense codes |
| 168 | */ |
| 169 | |
| 170 | /* No sense data available */ |
| 171 | extern const struct SCSISense sense_code_NO_SENSE; |
| 172 | /* LUN not ready, Manual intervention required */ |
| 173 | extern const struct SCSISense sense_code_LUN_NOT_READY; |
| 174 | /* LUN not ready, Medium not present */ |
| 175 | extern const struct SCSISense sense_code_NO_MEDIUM; |
Markus Armbruster | 68bb01f | 2011-09-06 18:58:49 +0200 | [diff] [blame] | 176 | /* LUN not ready, medium removal prevented */ |
| 177 | extern const struct SCSISense sense_code_NOT_READY_REMOVAL_PREVENTED; |
Hannes Reinecke | a1f0cce | 2011-04-18 12:53:14 +0200 | [diff] [blame] | 178 | /* Hardware error, internal target failure */ |
| 179 | extern const struct SCSISense sense_code_TARGET_FAILURE; |
| 180 | /* Illegal request, invalid command operation code */ |
| 181 | extern const struct SCSISense sense_code_INVALID_OPCODE; |
| 182 | /* Illegal request, LBA out of range */ |
| 183 | extern const struct SCSISense sense_code_LBA_OUT_OF_RANGE; |
| 184 | /* Illegal request, Invalid field in CDB */ |
| 185 | extern const struct SCSISense sense_code_INVALID_FIELD; |
Paolo Bonzini | 380feaf | 2012-07-10 15:02:55 +0200 | [diff] [blame] | 186 | /* Illegal request, Invalid field in parameter list */ |
| 187 | extern const struct SCSISense sense_code_INVALID_PARAM; |
| 188 | /* Illegal request, Parameter list length error */ |
| 189 | extern const struct SCSISense sense_code_INVALID_PARAM_LEN; |
Hannes Reinecke | a1f0cce | 2011-04-18 12:53:14 +0200 | [diff] [blame] | 190 | /* Illegal request, LUN not supported */ |
| 191 | extern const struct SCSISense sense_code_LUN_NOT_SUPPORTED; |
Paolo Bonzini | a872a30 | 2011-08-03 10:49:16 +0200 | [diff] [blame] | 192 | /* Illegal request, Saving parameters not supported */ |
| 193 | extern const struct SCSISense sense_code_SAVING_PARAMS_NOT_SUPPORTED; |
| 194 | /* Illegal request, Incompatible format */ |
| 195 | extern const struct SCSISense sense_code_INCOMPATIBLE_FORMAT; |
Markus Armbruster | 68bb01f | 2011-09-06 18:58:49 +0200 | [diff] [blame] | 196 | /* Illegal request, medium removal prevented */ |
| 197 | extern const struct SCSISense sense_code_ILLEGAL_REQ_REMOVAL_PREVENTED; |
Hannes Reinecke | a1f0cce | 2011-04-18 12:53:14 +0200 | [diff] [blame] | 198 | /* Command aborted, I/O process terminated */ |
| 199 | extern const struct SCSISense sense_code_IO_ERROR; |
| 200 | /* Command aborted, I_T Nexus loss occurred */ |
| 201 | extern const struct SCSISense sense_code_I_T_NEXUS_LOSS; |
| 202 | /* Command aborted, Logical Unit failure */ |
| 203 | extern const struct SCSISense sense_code_LUN_FAILURE; |
Paolo Bonzini | aaebace | 2012-07-16 14:07:55 +0200 | [diff] [blame] | 204 | /* LUN not ready, Capacity data has changed */ |
| 205 | extern const struct SCSISense sense_code_CAPACITY_CHANGED; |
Paolo Bonzini | 8a9c16f | 2011-09-13 16:26:06 +0200 | [diff] [blame] | 206 | /* LUN not ready, Medium not present */ |
| 207 | extern const struct SCSISense sense_code_UNIT_ATTENTION_NO_MEDIUM; |
Paolo Bonzini | a872a30 | 2011-08-03 10:49:16 +0200 | [diff] [blame] | 208 | /* Unit attention, Power on, reset or bus device reset occurred */ |
| 209 | extern const struct SCSISense sense_code_RESET; |
| 210 | /* Unit attention, Medium may have changed*/ |
| 211 | extern const struct SCSISense sense_code_MEDIUM_CHANGED; |
| 212 | /* Unit attention, Reported LUNs data has changed */ |
| 213 | extern const struct SCSISense sense_code_REPORTED_LUNS_CHANGED; |
| 214 | /* Unit attention, Device internal reset */ |
| 215 | extern const struct SCSISense sense_code_DEVICE_INTERNAL_RESET; |
Ronnie Sahlberg | 6a8a685 | 2012-07-16 08:53:28 +0200 | [diff] [blame] | 216 | /* Data Protection, Write Protected */ |
| 217 | extern const struct SCSISense sense_code_WRITE_PROTECTED; |
Hannes Reinecke | a1f0cce | 2011-04-18 12:53:14 +0200 | [diff] [blame] | 218 | |
| 219 | #define SENSE_CODE(x) sense_code_ ## x |
| 220 | |
Paolo Bonzini | bb729f7 | 2012-09-05 17:57:19 +0200 | [diff] [blame] | 221 | uint32_t scsi_data_cdb_length(uint8_t *buf); |
| 222 | uint32_t scsi_cdb_length(uint8_t *buf); |
Hannes Reinecke | a1f0cce | 2011-04-18 12:53:14 +0200 | [diff] [blame] | 223 | int scsi_sense_valid(SCSISense sense); |
Paolo Bonzini | f3b338e | 2011-11-14 14:31:51 +0100 | [diff] [blame] | 224 | int scsi_build_sense(uint8_t *in_buf, int in_len, |
| 225 | uint8_t *buf, int len, bool fixed); |
Hannes Reinecke | a1f0cce | 2011-04-18 12:53:14 +0200 | [diff] [blame] | 226 | |
Paolo Bonzini | adcf275 | 2011-10-12 12:57:59 +0200 | [diff] [blame] | 227 | SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d, |
| 228 | uint32_t tag, uint32_t lun, void *hba_private); |
Hannes Reinecke | c5bf71a | 2011-07-11 15:02:24 +0200 | [diff] [blame] | 229 | SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun, |
Paolo Bonzini | c39ce11 | 2011-08-03 10:49:10 +0200 | [diff] [blame] | 230 | uint8_t *buf, void *hba_private); |
| 231 | int32_t scsi_req_enqueue(SCSIRequest *req); |
Gerd Hoffmann | 89b08ae | 2009-11-26 15:33:50 +0100 | [diff] [blame] | 232 | void scsi_req_free(SCSIRequest *req); |
Paolo Bonzini | ad2d30f | 2011-04-18 16:01:56 +0200 | [diff] [blame] | 233 | SCSIRequest *scsi_req_ref(SCSIRequest *req); |
| 234 | void scsi_req_unref(SCSIRequest *req); |
Gerd Hoffmann | 37659e5 | 2009-11-26 15:33:58 +0100 | [diff] [blame] | 235 | |
Paolo Bonzini | b45ef67 | 2011-08-03 10:49:07 +0200 | [diff] [blame] | 236 | void scsi_req_build_sense(SCSIRequest *req, SCSISense sense); |
Gerd Hoffmann | ec76686 | 2009-11-26 15:34:01 +0100 | [diff] [blame] | 237 | void scsi_req_print(SCSIRequest *req); |
Paolo Bonzini | ad3376c | 2011-04-18 15:28:11 +0200 | [diff] [blame] | 238 | void scsi_req_continue(SCSIRequest *req); |
Paolo Bonzini | ab9adc8 | 2011-04-18 14:59:13 +0200 | [diff] [blame] | 239 | void scsi_req_data(SCSIRequest *req, int len); |
Paolo Bonzini | 682a9b2 | 2011-08-03 10:49:06 +0200 | [diff] [blame] | 240 | void scsi_req_complete(SCSIRequest *req, int status); |
Paolo Bonzini | 0c34459 | 2011-04-21 13:21:02 +0200 | [diff] [blame] | 241 | uint8_t *scsi_req_get_buf(SCSIRequest *req); |
Hannes Reinecke | 7438221 | 2011-04-18 13:36:02 +0200 | [diff] [blame] | 242 | int scsi_req_get_sense(SCSIRequest *req, uint8_t *buf, int len); |
Paolo Bonzini | 19d110a | 2011-04-18 17:14:51 +0200 | [diff] [blame] | 243 | void scsi_req_abort(SCSIRequest *req, int status); |
Paolo Bonzini | 94d3f98 | 2011-04-18 22:53:08 +0200 | [diff] [blame] | 244 | void scsi_req_cancel(SCSIRequest *req); |
Paolo Bonzini | 71544d3 | 2011-10-25 12:53:36 +0200 | [diff] [blame] | 245 | void scsi_req_retry(SCSIRequest *req); |
Paolo Bonzini | c7b4887 | 2011-08-03 10:49:18 +0200 | [diff] [blame] | 246 | void scsi_device_purge_requests(SCSIDevice *sdev, SCSISense sense); |
Paolo Bonzini | e48e84e | 2012-07-16 14:18:58 +0200 | [diff] [blame] | 247 | void scsi_device_set_ua(SCSIDevice *sdev, SCSISense sense); |
Paolo Bonzini | 53200fa | 2012-07-16 14:22:36 +0200 | [diff] [blame] | 248 | void scsi_device_report_change(SCSIDevice *dev, SCSISense sense); |
Paolo Bonzini | b45ef67 | 2011-08-03 10:49:07 +0200 | [diff] [blame] | 249 | int scsi_device_get_sense(SCSIDevice *dev, uint8_t *buf, int len, bool fixed); |
Paolo Bonzini | 0d3545e | 2011-07-27 23:24:50 +0200 | [diff] [blame] | 250 | SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int target, int lun); |
Gerd Hoffmann | 89b08ae | 2009-11-26 15:33:50 +0100 | [diff] [blame] | 251 | |
Paolo Bonzini | 765d152 | 2011-10-12 12:54:31 +0200 | [diff] [blame] | 252 | /* scsi-generic.c. */ |
| 253 | extern const SCSIReqOps scsi_generic_req_ops; |
| 254 | |
Gerd Hoffmann | 43b443b | 2009-10-30 09:54:00 +0100 | [diff] [blame] | 255 | #endif |