Revision 0d65e1f8 hw/scsi-disk.c
b/hw/scsi-disk.c | ||
---|---|---|
30 | 30 |
#include "qemu-common.h" |
31 | 31 |
#include "block.h" |
32 | 32 |
#include "scsi.h" |
33 |
|
|
34 |
#define SENSE_NO_SENSE 0 |
|
35 |
#define SENSE_NOT_READY 2 |
|
36 |
#define SENSE_HARDWARE_ERROR 4 |
|
37 |
#define SENSE_ILLEGAL_REQUEST 5 |
|
38 |
|
|
39 |
#define STATUS_GOOD 0 |
|
40 |
#define STATUS_CHECK_CONDITION 2 |
|
33 |
#include "scsi-defs.h" |
|
41 | 34 |
|
42 | 35 |
#define SCSI_DMA_BUF_SIZE 131072 |
43 | 36 |
#define SCSI_MAX_INQUIRY_LEN 256 |
... | ... | |
128 | 121 |
if (ret) { |
129 | 122 |
DPRINTF("IO error\n"); |
130 | 123 |
r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, 0); |
131 |
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NO_SENSE);
|
|
124 |
scsi_command_complete(r, CHECK_CONDITION, NO_SENSE);
|
|
132 | 125 |
return; |
133 | 126 |
} |
134 | 127 |
DPRINTF("Data ready tag=0x%x len=%" PRId64 "\n", r->req.tag, r->iov.iov_len); |
... | ... | |
147 | 140 |
if (!r) { |
148 | 141 |
BADF("Bad read tag 0x%x\n", tag); |
149 | 142 |
/* ??? This is the wrong error. */ |
150 |
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
|
|
143 |
scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
|
|
151 | 144 |
return; |
152 | 145 |
} |
153 | 146 |
if (r->sector_count == (uint32_t)-1) { |
... | ... | |
158 | 151 |
} |
159 | 152 |
DPRINTF("Read sector_count=%d\n", r->sector_count); |
160 | 153 |
if (r->sector_count == 0) { |
161 |
scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
|
|
154 |
scsi_command_complete(r, GOOD, NO_SENSE);
|
|
162 | 155 |
return; |
163 | 156 |
} |
164 | 157 |
|
... | ... | |
171 | 164 |
r->req.aiocb = bdrv_aio_readv(s->dinfo->bdrv, r->sector, &r->qiov, n, |
172 | 165 |
scsi_read_complete, r); |
173 | 166 |
if (r->req.aiocb == NULL) |
174 |
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
|
|
167 |
scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
|
|
175 | 168 |
r->sector += n; |
176 | 169 |
r->sector_count -= n; |
177 | 170 |
} |
... | ... | |
189 | 182 |
r->status |= SCSI_REQ_STATUS_RETRY; |
190 | 183 |
vm_stop(0); |
191 | 184 |
} else { |
192 |
scsi_command_complete(r, STATUS_CHECK_CONDITION,
|
|
193 |
SENSE_HARDWARE_ERROR);
|
|
185 |
scsi_command_complete(r, CHECK_CONDITION, |
|
186 |
HARDWARE_ERROR); |
|
194 | 187 |
} |
195 | 188 |
|
196 | 189 |
return 1; |
... | ... | |
213 | 206 |
r->sector += n; |
214 | 207 |
r->sector_count -= n; |
215 | 208 |
if (r->sector_count == 0) { |
216 |
scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
|
|
209 |
scsi_command_complete(r, GOOD, NO_SENSE);
|
|
217 | 210 |
} else { |
218 | 211 |
len = r->sector_count * 512; |
219 | 212 |
if (len > SCSI_DMA_BUF_SIZE) { |
... | ... | |
236 | 229 |
r->req.aiocb = bdrv_aio_writev(s->dinfo->bdrv, r->sector, &r->qiov, n, |
237 | 230 |
scsi_write_complete, r); |
238 | 231 |
if (r->req.aiocb == NULL) |
239 |
scsi_command_complete(r, STATUS_CHECK_CONDITION,
|
|
240 |
SENSE_HARDWARE_ERROR);
|
|
232 |
scsi_command_complete(r, CHECK_CONDITION, |
|
233 |
HARDWARE_ERROR); |
|
241 | 234 |
} else { |
242 | 235 |
/* Invoke completion routine to fetch data from host. */ |
243 | 236 |
scsi_write_complete(r, 0); |
... | ... | |
255 | 248 |
r = scsi_find_request(s, tag); |
256 | 249 |
if (!r) { |
257 | 250 |
BADF("Bad write tag 0x%x\n", tag); |
258 |
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
|
|
251 |
scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
|
|
259 | 252 |
return 1; |
260 | 253 |
} |
261 | 254 |
|
... | ... | |
401 | 394 |
goto fail; |
402 | 395 |
memset(outbuf, 0, 4); |
403 | 396 |
r->iov.iov_len = 4; |
404 |
if (s->sense == SENSE_NOT_READY && len >= 18) {
|
|
397 |
if (s->sense == NOT_READY && len >= 18) { |
|
405 | 398 |
memset(outbuf, 0, 18); |
406 | 399 |
r->iov.iov_len = 18; |
407 | 400 |
outbuf[7] = 10; |
... | ... | |
767 | 760 |
r->iov.iov_len = 8; |
768 | 761 |
} else { |
769 | 762 |
notready: |
770 |
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
|
|
763 |
scsi_command_complete(r, CHECK_CONDITION, NOT_READY);
|
|
771 | 764 |
return 0; |
772 | 765 |
} |
773 | 766 |
break; |
... | ... | |
877 | 870 |
/* Protection, exponent and lowest lba field left blank. */ |
878 | 871 |
r->iov.iov_len = len; |
879 | 872 |
} else { |
880 |
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
|
|
873 |
scsi_command_complete(r, CHECK_CONDITION, NOT_READY);
|
|
881 | 874 |
return 0; |
882 | 875 |
} |
883 | 876 |
break; |
... | ... | |
898 | 891 |
default: |
899 | 892 |
DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]); |
900 | 893 |
fail: |
901 |
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_ILLEGAL_REQUEST);
|
|
894 |
scsi_command_complete(r, CHECK_CONDITION, ILLEGAL_REQUEST);
|
|
902 | 895 |
return 0; |
903 | 896 |
illegal_lba: |
904 |
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
|
|
897 |
scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
|
|
905 | 898 |
return 0; |
906 | 899 |
} |
907 | 900 |
if (r->sector_count == 0 && r->iov.iov_len == 0) { |
908 |
scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
|
|
901 |
scsi_command_complete(r, GOOD, NO_SENSE);
|
|
909 | 902 |
} |
910 | 903 |
len = r->sector_count * 512 + r->iov.iov_len; |
911 | 904 |
if (is_write) { |
Also available in: Unified diff