Commit 47e4ca5abd9679300e78771de923ce9d708467cb

Authored by balrog
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,6 +34,18 @@ do { fprintf(stderr, "scsi-disk: " fmt , ##args); } while (0)
34 #define SENSE_HARDWARE_ERROR 4 34 #define SENSE_HARDWARE_ERROR 4
35 #define SENSE_ILLEGAL_REQUEST 5 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 #define SCSI_DMA_BUF_SIZE 65536 49 #define SCSI_DMA_BUF_SIZE 65536
38 50
39 typedef struct SCSIRequest { 51 typedef struct SCSIRequest {
@@ -124,7 +136,7 @@ static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag) @@ -124,7 +136,7 @@ static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag)
124 } 136 }
125 137
126 /* Helper function for command completion. */ 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 SCSIDeviceState *s = r->dev; 141 SCSIDeviceState *s = r->dev;
130 uint32_t tag; 142 uint32_t tag;
@@ -132,7 +144,7 @@ static void scsi_command_complete(SCSIRequest *r, int sense) @@ -132,7 +144,7 @@ static void scsi_command_complete(SCSIRequest *r, int sense)
132 s->sense = sense; 144 s->sense = sense;
133 tag = r->tag; 145 tag = r->tag;
134 scsi_remove_request(r); 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 /* Cancel a pending data transfer. */ 150 /* Cancel a pending data transfer. */
@@ -157,7 +169,7 @@ static void scsi_read_complete(void * opaque, int ret) @@ -157,7 +169,7 @@ static void scsi_read_complete(void * opaque, int ret)
157 169
158 if (ret) { 170 if (ret) {
159 DPRINTF("IO error\n"); 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 return; 173 return;
162 } 174 }
163 DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->buf_len); 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,8 +187,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag)
175 r = scsi_find_request(s, tag); 187 r = scsi_find_request(s, tag);
176 if (!r) { 188 if (!r) {
177 BADF("Bad read tag 0x%x\n", tag); 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 return; 191 return;
181 } 192 }
182 if (r->sector_count == (uint32_t)-1) { 193 if (r->sector_count == (uint32_t)-1) {
@@ -187,7 +198,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag) @@ -187,7 +198,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag)
187 } 198 }
188 DPRINTF("Read sector_count=%d\n", r->sector_count); 199 DPRINTF("Read sector_count=%d\n", r->sector_count);
189 if (r->sector_count == 0) { 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 return; 202 return;
192 } 203 }
193 204
@@ -199,7 +210,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag) @@ -199,7 +210,7 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag)
199 r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n, 210 r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n,
200 scsi_read_complete, r); 211 scsi_read_complete, r);
201 if (r->aiocb == NULL) 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 r->sector += n; 214 r->sector += n;
204 r->sector_count -= n; 215 r->sector_count -= n;
205 } 216 }
@@ -217,7 +228,7 @@ static void scsi_write_complete(void * opaque, int ret) @@ -217,7 +228,7 @@ static void scsi_write_complete(void * opaque, int ret)
217 228
218 r->aiocb = NULL; 229 r->aiocb = NULL;
219 if (r->sector_count == 0) { 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 } else { 232 } else {
222 len = r->sector_count * 512; 233 len = r->sector_count * 512;
223 if (len > SCSI_DMA_BUF_SIZE) { 234 if (len > SCSI_DMA_BUF_SIZE) {
@@ -241,7 +252,7 @@ static int scsi_write_data(SCSIDevice *d, uint32_t tag) @@ -241,7 +252,7 @@ static int scsi_write_data(SCSIDevice *d, uint32_t tag)
241 r = scsi_find_request(s, tag); 252 r = scsi_find_request(s, tag);
242 if (!r) { 253 if (!r) {
243 BADF("Bad write tag 0x%x\n", tag); 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 return 1; 256 return 1;
246 } 257 }
247 if (r->aiocb) 258 if (r->aiocb)
@@ -251,7 +262,7 @@ static int scsi_write_data(SCSIDevice *d, uint32_t tag) @@ -251,7 +262,7 @@ static int scsi_write_data(SCSIDevice *d, uint32_t tag)
251 r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n, 262 r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n,
252 scsi_write_complete, r); 263 scsi_write_complete, r);
253 if (r->aiocb == NULL) 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 r->sector += n; 266 r->sector += n;
256 r->sector_count -= n; 267 r->sector_count -= n;
257 } else { 268 } else {
@@ -601,7 +612,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -601,7 +612,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
601 outbuf[7] = 0; 612 outbuf[7] = 0;
602 r->buf_len = 8; 613 r->buf_len = 8;
603 } else { 614 } else {
604 - scsi_command_complete(r, SENSE_NOT_READY); 615 + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_NOT_READY);
605 return 0; 616 return 0;
606 } 617 }
607 break; 618 break;
@@ -688,11 +699,11 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -688,11 +699,11 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
688 default: 699 default:
689 DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]); 700 DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
690 fail: 701 fail:
691 - scsi_command_complete(r, SENSE_ILLEGAL_REQUEST); 702 + scsi_command_complete(r, SCSI_CHECK_COND, SENSE_ILLEGAL_REQUEST);
692 return 0; 703 return 0;
693 } 704 }
694 if (r->sector_count == 0 && r->buf_len == 0) { 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 len = r->sector_count * 512 + r->buf_len; 708 len = r->sector_count * 512 + r->buf_len;
698 if (is_write) { 709 if (is_write) {