Commit 47e4ca5abd9679300e78771de923ce9d708467cb
1 parent
4a0d8278
Fix scsi-disk sense-key/status confusion (Marcelo Tosatti).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4260 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
24 additions
and
13 deletions
hw/scsi-disk.c
... | ... | @@ -34,6 +34,18 @@ do { fprintf(stderr, "scsi-disk: " fmt , ##args); } while (0) |
34 | 34 | #define SENSE_HARDWARE_ERROR 4 |
35 | 35 | #define SENSE_ILLEGAL_REQUEST 5 |
36 | 36 | |
37 | +#define SCSI_OK 0 | |
38 | +#define SCSI_CHECK_COND 0x2 | |
39 | +#define SCSI_COND_MET 0x4 | |
40 | +#define SCSI_BUSY 0x8 | |
41 | +#define SCSI_INTERMEDIATE 0x10 | |
42 | +#define SCSI_INTER_MET 0x14 | |
43 | +#define SCSI_RES_CONFLICT 0x18 | |
44 | +#define SCSI_CMD_TERMINATED 0x22 | |
45 | +#define SCSI_QUEUE_FULL 0x28 | |
46 | +#define SCSI_ACA_ACTIVE 0x30 | |
47 | +#define SCSI_TASK_ABORTED 0x40 | |
48 | + | |
37 | 49 | #define SCSI_DMA_BUF_SIZE 65536 |
38 | 50 | |
39 | 51 | typedef struct SCSIRequest { |
... | ... | @@ -124,7 +136,7 @@ static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag) |
124 | 136 | } |
125 | 137 | |
126 | 138 | /* Helper function for command completion. */ |
127 | -static void scsi_command_complete(SCSIRequest *r, int sense) | |
139 | +static void scsi_command_complete(SCSIRequest *r, int status, int sense) | |
128 | 140 | { |
129 | 141 | SCSIDeviceState *s = r->dev; |
130 | 142 | uint32_t tag; |
... | ... | @@ -132,7 +144,7 @@ static void scsi_command_complete(SCSIRequest *r, int sense) |
132 | 144 | s->sense = sense; |
133 | 145 | tag = r->tag; |
134 | 146 | scsi_remove_request(r); |
135 | - s->completion(s->opaque, SCSI_REASON_DONE, tag, sense); | |
147 | + s->completion(s->opaque, SCSI_REASON_DONE, tag, status); | |
136 | 148 | } |
137 | 149 | |
138 | 150 | /* Cancel a pending data transfer. */ |
... | ... | @@ -157,7 +169,7 @@ static void scsi_read_complete(void * opaque, int ret) |
157 | 169 | |
158 | 170 | if (ret) { |
159 | 171 | DPRINTF("IO error\n"); |
160 | - scsi_command_complete(r, SENSE_HARDWARE_ERROR); | |
172 | + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_HARDWARE_ERROR); | |
161 | 173 | return; |
162 | 174 | } |
163 | 175 | DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->buf_len); |
... | ... | @@ -175,8 +187,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag) |
175 | 187 | r = scsi_find_request(s, tag); |
176 | 188 | if (!r) { |
177 | 189 | BADF("Bad read tag 0x%x\n", tag); |
178 | - /* ??? This is the wrong error. */ | |
179 | - scsi_command_complete(r, SENSE_HARDWARE_ERROR); | |
190 | + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_HARDWARE_ERROR); | |
180 | 191 | return; |
181 | 192 | } |
182 | 193 | if (r->sector_count == (uint32_t)-1) { |
... | ... | @@ -187,7 +198,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag) |
187 | 198 | } |
188 | 199 | DPRINTF("Read sector_count=%d\n", r->sector_count); |
189 | 200 | if (r->sector_count == 0) { |
190 | - scsi_command_complete(r, SENSE_NO_SENSE); | |
201 | + scsi_command_complete(r, SCSI_OK, SENSE_NO_SENSE); | |
191 | 202 | return; |
192 | 203 | } |
193 | 204 | |
... | ... | @@ -199,7 +210,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag) |
199 | 210 | r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n, |
200 | 211 | scsi_read_complete, r); |
201 | 212 | if (r->aiocb == NULL) |
202 | - scsi_command_complete(r, SENSE_HARDWARE_ERROR); | |
213 | + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_HARDWARE_ERROR); | |
203 | 214 | r->sector += n; |
204 | 215 | r->sector_count -= n; |
205 | 216 | } |
... | ... | @@ -217,7 +228,7 @@ static void scsi_write_complete(void * opaque, int ret) |
217 | 228 | |
218 | 229 | r->aiocb = NULL; |
219 | 230 | if (r->sector_count == 0) { |
220 | - scsi_command_complete(r, SENSE_NO_SENSE); | |
231 | + scsi_command_complete(r, SCSI_OK, SENSE_NO_SENSE); | |
221 | 232 | } else { |
222 | 233 | len = r->sector_count * 512; |
223 | 234 | if (len > SCSI_DMA_BUF_SIZE) { |
... | ... | @@ -241,7 +252,7 @@ static int scsi_write_data(SCSIDevice *d, uint32_t tag) |
241 | 252 | r = scsi_find_request(s, tag); |
242 | 253 | if (!r) { |
243 | 254 | BADF("Bad write tag 0x%x\n", tag); |
244 | - scsi_command_complete(r, SENSE_HARDWARE_ERROR); | |
255 | + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_HARDWARE_ERROR); | |
245 | 256 | return 1; |
246 | 257 | } |
247 | 258 | if (r->aiocb) |
... | ... | @@ -251,7 +262,7 @@ static int scsi_write_data(SCSIDevice *d, uint32_t tag) |
251 | 262 | r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n, |
252 | 263 | scsi_write_complete, r); |
253 | 264 | if (r->aiocb == NULL) |
254 | - scsi_command_complete(r, SENSE_HARDWARE_ERROR); | |
265 | + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_HARDWARE_ERROR); | |
255 | 266 | r->sector += n; |
256 | 267 | r->sector_count -= n; |
257 | 268 | } else { |
... | ... | @@ -601,7 +612,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
601 | 612 | outbuf[7] = 0; |
602 | 613 | r->buf_len = 8; |
603 | 614 | } else { |
604 | - scsi_command_complete(r, SENSE_NOT_READY); | |
615 | + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_NOT_READY); | |
605 | 616 | return 0; |
606 | 617 | } |
607 | 618 | break; |
... | ... | @@ -688,11 +699,11 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
688 | 699 | default: |
689 | 700 | DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]); |
690 | 701 | fail: |
691 | - scsi_command_complete(r, SENSE_ILLEGAL_REQUEST); | |
702 | + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_ILLEGAL_REQUEST); | |
692 | 703 | return 0; |
693 | 704 | } |
694 | 705 | if (r->sector_count == 0 && r->buf_len == 0) { |
695 | - scsi_command_complete(r, SENSE_NO_SENSE); | |
706 | + scsi_command_complete(r, SCSI_OK, SENSE_NO_SENSE); | |
696 | 707 | } |
697 | 708 | len = r->sector_count * 512 + r->buf_len; |
698 | 709 | if (is_write) { | ... | ... |