]> git.proxmox.com Git - mirror_qemu.git/blob - hw/scsi-generic.c
PCI: Mask writes to RO bits in the command reg of PCI config space
[mirror_qemu.git] / hw / scsi-generic.c
1 /*
2 * Generic SCSI Device support
3 *
4 * Copyright (c) 2007 Bull S.A.S.
5 * Based on code by Paul Brook
6 * Based on code by Fabrice Bellard
7 *
8 * Written by Laurent Vivier <Laurent.Vivier@bull.net>
9 *
10 * This code is licenced under the LGPL.
11 *
12 */
13
14 #include "qemu-common.h"
15 #include "block.h"
16 #include "scsi-disk.h"
17
18 #ifndef __linux__
19
20 SCSIDevice *scsi_generic_init(BlockDriverState *bdrv, int tcq,
21 scsi_completionfn completion, void *opaque)
22 {
23 return NULL;
24 }
25
26 #else /* __linux__ */
27
28 //#define DEBUG_SCSI
29
30 #ifdef DEBUG_SCSI
31 #define DPRINTF(fmt, args...) \
32 do { printf("scsi-generic: " fmt , ##args); } while (0)
33 #else
34 #define DPRINTF(fmt, args...) do {} while(0)
35 #endif
36
37 #define BADF(fmt, args...) \
38 do { fprintf(stderr, "scsi-generic: " fmt , ##args); } while (0)
39
40 #include <stdio.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <unistd.h>
44 #include <scsi/sg.h>
45 #include <scsi/scsi.h>
46
47 #define REWIND 0x01
48 #define REPORT_DENSITY_SUPPORT 0x44
49 #define LOAD_UNLOAD 0xa6
50 #define SET_CD_SPEED 0xbb
51 #define BLANK 0xa1
52
53 #define SCSI_CMD_BUF_SIZE 16
54 #define SCSI_SENSE_BUF_SIZE 96
55
56 #define SG_ERR_DRIVER_TIMEOUT 0x06
57 #define SG_ERR_DRIVER_SENSE 0x08
58
59 #ifndef MAX_UINT
60 #define MAX_UINT ((unsigned int)-1)
61 #endif
62
63 typedef struct SCSIRequest {
64 BlockDriverAIOCB *aiocb;
65 struct SCSIRequest *next;
66 SCSIDeviceState *dev;
67 uint32_t tag;
68 uint8_t cmd[SCSI_CMD_BUF_SIZE];
69 int cmdlen;
70 uint8_t *buf;
71 int buflen;
72 int len;
73 sg_io_hdr_t io_header;
74 } SCSIRequest;
75
76 struct SCSIDeviceState
77 {
78 SCSIRequest *requests;
79 BlockDriverState *bdrv;
80 int type;
81 int blocksize;
82 int lun;
83 scsi_completionfn completion;
84 void *opaque;
85 int driver_status;
86 uint8_t sensebuf[SCSI_SENSE_BUF_SIZE];
87 uint8_t senselen;
88 };
89
90 /* Global pool of SCSIRequest structures. */
91 static SCSIRequest *free_requests = NULL;
92
93 static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag)
94 {
95 SCSIRequest *r;
96
97 if (free_requests) {
98 r = free_requests;
99 free_requests = r->next;
100 } else {
101 r = qemu_malloc(sizeof(SCSIRequest));
102 r->buf = NULL;
103 r->buflen = 0;
104 }
105 r->dev = s;
106 r->tag = tag;
107 memset(r->cmd, 0, sizeof(r->cmd));
108 memset(&r->io_header, 0, sizeof(r->io_header));
109 r->cmdlen = 0;
110 r->len = 0;
111 r->aiocb = NULL;
112
113 /* link */
114
115 r->next = s->requests;
116 s->requests = r;
117 return r;
118 }
119
120 static void scsi_remove_request(SCSIRequest *r)
121 {
122 SCSIRequest *last;
123 SCSIDeviceState *s = r->dev;
124
125 if (s->requests == r) {
126 s->requests = r->next;
127 } else {
128 last = s->requests;
129 while (last && last->next != r)
130 last = last->next;
131 if (last) {
132 last->next = r->next;
133 } else {
134 BADF("Orphaned request\n");
135 }
136 }
137 r->next = free_requests;
138 free_requests = r;
139 }
140
141 static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag)
142 {
143 SCSIRequest *r;
144
145 r = s->requests;
146 while (r && r->tag != tag)
147 r = r->next;
148
149 return r;
150 }
151
152 /* Helper function for command completion. */
153 static void scsi_command_complete(void *opaque, int ret)
154 {
155 SCSIRequest *r = (SCSIRequest *)opaque;
156 SCSIDeviceState *s = r->dev;
157 uint32_t tag;
158 int status;
159
160 s->driver_status = r->io_header.driver_status;
161 if (s->driver_status & SG_ERR_DRIVER_SENSE)
162 s->senselen = r->io_header.sb_len_wr;
163
164 if (ret != 0)
165 status = BUSY << 1;
166 else {
167 if (s->driver_status & SG_ERR_DRIVER_TIMEOUT) {
168 status = BUSY << 1;
169 BADF("Driver Timeout\n");
170 } else if (r->io_header.status)
171 status = r->io_header.status;
172 else if (s->driver_status & SG_ERR_DRIVER_SENSE)
173 status = CHECK_CONDITION << 1;
174 else
175 status = GOOD << 1;
176 }
177 DPRINTF("Command complete 0x%p tag=0x%x status=%d\n",
178 r, r->tag, status);
179 tag = r->tag;
180 scsi_remove_request(r);
181 s->completion(s->opaque, SCSI_REASON_DONE, tag, status);
182 }
183
184 /* Cancel a pending data transfer. */
185 static void scsi_cancel_io(SCSIDevice *d, uint32_t tag)
186 {
187 DPRINTF("scsi_cancel_io 0x%x\n", tag);
188 SCSIDeviceState *s = d->state;
189 SCSIRequest *r;
190 DPRINTF("Cancel tag=0x%x\n", tag);
191 r = scsi_find_request(s, tag);
192 if (r) {
193 if (r->aiocb)
194 bdrv_aio_cancel(r->aiocb);
195 r->aiocb = NULL;
196 scsi_remove_request(r);
197 }
198 }
199
200 static int execute_command(BlockDriverState *bdrv,
201 SCSIRequest *r, int direction,
202 BlockDriverCompletionFunc *complete)
203 {
204
205 r->io_header.interface_id = 'S';
206 r->io_header.dxfer_direction = direction;
207 r->io_header.dxferp = r->buf;
208 r->io_header.dxfer_len = r->buflen;
209 r->io_header.cmdp = r->cmd;
210 r->io_header.cmd_len = r->cmdlen;
211 r->io_header.mx_sb_len = sizeof(r->dev->sensebuf);
212 r->io_header.sbp = r->dev->sensebuf;
213 r->io_header.timeout = MAX_UINT;
214 r->io_header.usr_ptr = r;
215 r->io_header.flags |= SG_FLAG_DIRECT_IO;
216
217 if (bdrv_pwrite(bdrv, -1, &r->io_header, sizeof(r->io_header)) == -1) {
218 BADF("execute_command: write failed ! (%d)\n", errno);
219 return -1;
220 }
221 if (complete == NULL) {
222 int ret;
223 r->aiocb = NULL;
224 while ((ret = bdrv_pread(bdrv, -1, &r->io_header,
225 sizeof(r->io_header))) == -1 &&
226 errno == EINTR);
227 if (ret == -1) {
228 BADF("execute_command: read failed !\n");
229 return -1;
230 }
231 return 0;
232 }
233
234 r->aiocb = bdrv_aio_read(bdrv, 0, (uint8_t*)&r->io_header,
235 -(int64_t)sizeof(r->io_header), complete, r);
236 if (r->aiocb == NULL) {
237 BADF("execute_command: read failed !\n");
238 return -1;
239 }
240
241 return 0;
242 }
243
244 static void scsi_read_complete(void * opaque, int ret)
245 {
246 SCSIRequest *r = (SCSIRequest *)opaque;
247 SCSIDeviceState *s = r->dev;
248 int len;
249
250 if (ret) {
251 DPRINTF("IO error\n");
252 scsi_command_complete(r, ret);
253 return;
254 }
255 len = r->io_header.dxfer_len - r->io_header.resid;
256 DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, len);
257
258 r->len = -1;
259 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);
260 if (len == 0)
261 scsi_command_complete(r, 0);
262 }
263
264 /* Read more data from scsi device into buffer. */
265 static void scsi_read_data(SCSIDevice *d, uint32_t tag)
266 {
267 SCSIDeviceState *s = d->state;
268 SCSIRequest *r;
269 int ret;
270
271 DPRINTF("scsi_read_data 0x%x\n", tag);
272 r = scsi_find_request(s, tag);
273 if (!r) {
274 BADF("Bad read tag 0x%x\n", tag);
275 /* ??? This is the wrong error. */
276 scsi_command_complete(r, -EINVAL);
277 return;
278 }
279
280 if (r->len == -1) {
281 scsi_command_complete(r, 0);
282 return;
283 }
284
285 if (r->cmd[0] == REQUEST_SENSE && s->driver_status & SG_ERR_DRIVER_SENSE)
286 {
287 s->senselen = MIN(r->len, s->senselen);
288 memcpy(r->buf, s->sensebuf, s->senselen);
289 r->io_header.driver_status = 0;
290 r->io_header.status = 0;
291 r->io_header.dxfer_len = s->senselen;
292 r->len = -1;
293 DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, s->senselen);
294 DPRINTF("Sense: %d %d %d %d %d %d %d %d\n",
295 r->buf[0], r->buf[1], r->buf[2], r->buf[3],
296 r->buf[4], r->buf[5], r->buf[6], r->buf[7]);
297 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, s->senselen);
298 return;
299 }
300
301 ret = execute_command(s->bdrv, r, SG_DXFER_FROM_DEV, scsi_read_complete);
302 if (ret == -1) {
303 scsi_command_complete(r, -EINVAL);
304 return;
305 }
306 }
307
308 static void scsi_write_complete(void * opaque, int ret)
309 {
310 SCSIRequest *r = (SCSIRequest *)opaque;
311
312 DPRINTF("scsi_write_complete() ret = %d\n", ret);
313 if (ret) {
314 DPRINTF("IO error\n");
315 scsi_command_complete(r, ret);
316 return;
317 }
318
319 if (r->cmd[0] == MODE_SELECT && r->cmd[4] == 12 &&
320 r->dev->type == TYPE_TAPE) {
321 r->dev->blocksize = (r->buf[9] << 16) | (r->buf[10] << 8) | r->buf[11];
322 DPRINTF("block size %d\n", r->dev->blocksize);
323 }
324
325 scsi_command_complete(r, ret);
326 }
327
328 /* Write data to a scsi device. Returns nonzero on failure.
329 The transfer may complete asynchronously. */
330 static int scsi_write_data(SCSIDevice *d, uint32_t tag)
331 {
332 SCSIDeviceState *s = d->state;
333 SCSIRequest *r;
334 int ret;
335
336 DPRINTF("scsi_write_data 0x%x\n", tag);
337 r = scsi_find_request(s, tag);
338 if (!r) {
339 BADF("Bad write tag 0x%x\n", tag);
340 /* ??? This is the wrong error. */
341 scsi_command_complete(r, -EINVAL);
342 return 0;
343 }
344
345 if (r->len == 0) {
346 r->len = r->buflen;
347 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->len);
348 return 0;
349 }
350
351 ret = execute_command(s->bdrv, r, SG_DXFER_TO_DEV, scsi_write_complete);
352 if (ret == -1) {
353 scsi_command_complete(r, -EINVAL);
354 return 1;
355 }
356
357 return 0;
358 }
359
360 /* Return a pointer to the data buffer. */
361 static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
362 {
363 SCSIDeviceState *s = d->state;
364 SCSIRequest *r;
365 r = scsi_find_request(s, tag);
366 if (!r) {
367 BADF("Bad buffer tag 0x%x\n", tag);
368 return NULL;
369 }
370 return r->buf;
371 }
372
373 static int scsi_length(uint8_t *cmd, int blocksize, int *cmdlen, uint32_t *len)
374 {
375 switch (cmd[0] >> 5) {
376 case 0:
377 *len = cmd[4];
378 *cmdlen = 6;
379 /* length 0 means 256 blocks */
380 if (*len == 0)
381 *len = 256;
382 break;
383 case 1:
384 case 2:
385 *len = cmd[8] | (cmd[7] << 8);
386 *cmdlen = 10;
387 break;
388 case 4:
389 *len = cmd[13] | (cmd[12] << 8) | (cmd[11] << 16) | (cmd[10] << 24);
390 *cmdlen = 16;
391 break;
392 case 5:
393 *len = cmd[9] | (cmd[8] << 8) | (cmd[7] << 16) | (cmd[6] << 24);
394 *cmdlen = 12;
395 break;
396 default:
397 return -1;
398 }
399
400 switch(cmd[0]) {
401 case TEST_UNIT_READY:
402 case REZERO_UNIT:
403 case START_STOP:
404 case SEEK_6:
405 case WRITE_FILEMARKS:
406 case SPACE:
407 case ERASE:
408 case ALLOW_MEDIUM_REMOVAL:
409 case VERIFY:
410 case SEEK_10:
411 case SYNCHRONIZE_CACHE:
412 case LOCK_UNLOCK_CACHE:
413 case LOAD_UNLOAD:
414 case SET_CD_SPEED:
415 case SET_LIMITS:
416 case WRITE_LONG:
417 case MOVE_MEDIUM:
418 case UPDATE_BLOCK:
419 *len = 0;
420 break;
421 case MODE_SENSE:
422 break;
423 case WRITE_SAME:
424 *len = 1;
425 break;
426 case READ_CAPACITY:
427 *len = 8;
428 break;
429 case READ_BLOCK_LIMITS:
430 *len = 6;
431 break;
432 case READ_POSITION:
433 *len = 20;
434 break;
435 case SEND_VOLUME_TAG:
436 *len *= 40;
437 break;
438 case MEDIUM_SCAN:
439 *len *= 8;
440 break;
441 case WRITE_10:
442 cmd[1] &= ~0x08; /* disable FUA */
443 case WRITE_VERIFY:
444 case WRITE_6:
445 case WRITE_12:
446 case WRITE_VERIFY_12:
447 *len *= blocksize;
448 break;
449 case READ_10:
450 cmd[1] &= ~0x08; /* disable FUA */
451 case READ_6:
452 case READ_REVERSE:
453 case RECOVER_BUFFERED_DATA:
454 case READ_12:
455 *len *= blocksize;
456 break;
457 case INQUIRY:
458 *len = cmd[4] | (cmd[3] << 8);
459 break;
460 }
461 return 0;
462 }
463
464 static int scsi_stream_length(uint8_t *cmd, int blocksize, int *cmdlen, uint32_t *len)
465 {
466 switch(cmd[0]) {
467 /* stream commands */
468 case READ_6:
469 case READ_REVERSE:
470 case RECOVER_BUFFERED_DATA:
471 case WRITE_6:
472 *cmdlen = 6;
473 *len = cmd[4] | (cmd[3] << 8) | (cmd[2] << 16);
474 if (cmd[1] & 0x01) /* fixed */
475 *len *= blocksize;
476 break;
477 case REWIND:
478 case START_STOP:
479 *cmdlen = 6;
480 *len = 0;
481 cmd[1] = 0x01; /* force IMMED, otherwise qemu waits end of command */
482 break;
483 /* generic commands */
484 default:
485 return scsi_length(cmd, blocksize, cmdlen, len);
486 }
487 return 0;
488 }
489
490 static int is_write(int command)
491 {
492 switch (command) {
493 case COPY:
494 case COPY_VERIFY:
495 case COMPARE:
496 case CHANGE_DEFINITION:
497 case LOG_SELECT:
498 case MODE_SELECT:
499 case MODE_SELECT_10:
500 case SEND_DIAGNOSTIC:
501 case WRITE_BUFFER:
502 case FORMAT_UNIT:
503 case REASSIGN_BLOCKS:
504 case RESERVE:
505 case SEARCH_EQUAL:
506 case SEARCH_HIGH:
507 case SEARCH_LOW:
508 case WRITE_6:
509 case WRITE_10:
510 case WRITE_VERIFY:
511 case UPDATE_BLOCK:
512 case WRITE_LONG:
513 case WRITE_SAME:
514 case SEARCH_HIGH_12:
515 case SEARCH_EQUAL_12:
516 case SEARCH_LOW_12:
517 case WRITE_12:
518 case WRITE_VERIFY_12:
519 case SET_WINDOW:
520 case MEDIUM_SCAN:
521 case SEND_VOLUME_TAG:
522 case WRITE_LONG_2:
523 return 1;
524 }
525 return 0;
526 }
527
528 /* Execute a scsi command. Returns the length of the data expected by the
529 command. This will be Positive for data transfers from the device
530 (eg. disk reads), negative for transfers to the device (eg. disk writes),
531 and zero if the command does not transfer any data. */
532
533 static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
534 uint8_t *cmd, int lun)
535 {
536 SCSIDeviceState *s = d->state;
537 uint32_t len=0;
538 int cmdlen=0;
539 SCSIRequest *r;
540 int ret;
541
542 if (s->type == TYPE_TAPE) {
543 if (scsi_stream_length(cmd, s->blocksize, &cmdlen, &len) == -1) {
544 BADF("Unsupported command length, command %x\n", cmd[0]);
545 return 0;
546 }
547 } else {
548 if (scsi_length(cmd, s->blocksize, &cmdlen, &len) == -1) {
549 BADF("Unsupported command length, command %x\n", cmd[0]);
550 return 0;
551 }
552 }
553
554 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x len %d\n", lun, tag,
555 cmd[0], len);
556
557 if (cmd[0] != REQUEST_SENSE &&
558 (lun != s->lun || (cmd[1] >> 5) != s->lun)) {
559 DPRINTF("Unimplemented LUN %d\n", lun ? lun : cmd[1] >> 5);
560
561 s->sensebuf[0] = 0x70;
562 s->sensebuf[1] = 0x00;
563 s->sensebuf[2] = ILLEGAL_REQUEST;
564 s->sensebuf[3] = 0x00;
565 s->sensebuf[4] = 0x00;
566 s->sensebuf[5] = 0x00;
567 s->sensebuf[6] = 0x00;
568 s->senselen = 7;
569 s->driver_status = SG_ERR_DRIVER_SENSE;
570 s->completion(s->opaque, SCSI_REASON_DONE, tag, CHECK_CONDITION << 1);
571 return 0;
572 }
573
574 r = scsi_find_request(s, tag);
575 if (r) {
576 BADF("Tag 0x%x already in use %p\n", tag, r);
577 scsi_cancel_io(d, tag);
578 }
579 r = scsi_new_request(s, tag);
580
581 memcpy(r->cmd, cmd, cmdlen);
582 r->cmdlen = cmdlen;
583
584 if (len == 0) {
585 if (r->buf != NULL)
586 free(r->buf);
587 r->buflen = 0;
588 r->buf = NULL;
589 ret = execute_command(s->bdrv, r, SG_DXFER_NONE, scsi_command_complete);
590 if (ret == -1) {
591 scsi_command_complete(r, -EINVAL);
592 return 0;
593 }
594 return 0;
595 }
596
597 if (r->buflen != len) {
598 if (r->buf != NULL)
599 free(r->buf);
600 r->buf = qemu_malloc(len);
601 r->buflen = len;
602 }
603
604 memset(r->buf, 0, r->buflen);
605 r->len = len;
606 if (is_write(cmd[0])) {
607 r->len = 0;
608 return -len;
609 }
610
611 return len;
612 }
613
614 static int get_blocksize(BlockDriverState *bdrv)
615 {
616 uint8_t cmd[10];
617 uint8_t buf[8];
618 uint8_t sensebuf[8];
619 sg_io_hdr_t io_header;
620 int ret;
621
622 memset(cmd, 0, sizeof(cmd));
623 memset(buf, 0, sizeof(buf));
624 cmd[0] = READ_CAPACITY;
625
626 memset(&io_header, 0, sizeof(io_header));
627 io_header.interface_id = 'S';
628 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
629 io_header.dxfer_len = sizeof(buf);
630 io_header.dxferp = buf;
631 io_header.cmdp = cmd;
632 io_header.cmd_len = sizeof(cmd);
633 io_header.mx_sb_len = sizeof(sensebuf);
634 io_header.sbp = sensebuf;
635 io_header.timeout = 6000; /* XXX */
636
637 ret = bdrv_pwrite(bdrv, -1, &io_header, sizeof(io_header));
638 if (ret == -1)
639 return -1;
640
641 while ((ret = bdrv_pread(bdrv, -1, &io_header, sizeof(io_header))) == -1 &&
642 errno == EINTR);
643
644 if (ret == -1)
645 return -1;
646
647 return (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
648 }
649
650 static int get_stream_blocksize(BlockDriverState *bdrv)
651 {
652 uint8_t cmd[6];
653 uint8_t buf[12];
654 uint8_t sensebuf[8];
655 sg_io_hdr_t io_header;
656 int ret;
657
658 memset(cmd, 0, sizeof(cmd));
659 memset(buf, 0, sizeof(buf));
660 cmd[0] = MODE_SENSE;
661 cmd[4] = sizeof(buf);
662
663 memset(&io_header, 0, sizeof(io_header));
664 io_header.interface_id = 'S';
665 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
666 io_header.dxfer_len = sizeof(buf);
667 io_header.dxferp = buf;
668 io_header.cmdp = cmd;
669 io_header.cmd_len = sizeof(cmd);
670 io_header.mx_sb_len = sizeof(sensebuf);
671 io_header.sbp = sensebuf;
672 io_header.timeout = 6000; /* XXX */
673
674 ret = bdrv_pwrite(bdrv, -1, &io_header, sizeof(io_header));
675 if (ret == -1)
676 return -1;
677
678 while ((ret = bdrv_pread(bdrv, -1, &io_header, sizeof(io_header))) == -1 &&
679 errno == EINTR);
680
681 if (ret == -1)
682 return -1;
683
684 return (buf[9] << 16) | (buf[10] << 8) | buf[11];
685 }
686
687 static void scsi_destroy(SCSIDevice *d)
688 {
689 SCSIRequest *r, *n;
690
691 r = d->state->requests;
692 while (r) {
693 n = r->next;
694 qemu_free(r);
695 r = n;
696 }
697
698 r = free_requests;
699 while (r) {
700 n = r->next;
701 qemu_free(r);
702 r = n;
703 }
704
705 qemu_free(d->state);
706 qemu_free(d);
707 }
708
709 SCSIDevice *scsi_generic_init(BlockDriverState *bdrv, int tcq,
710 scsi_completionfn completion, void *opaque)
711 {
712 int sg_version;
713 SCSIDevice *d;
714 SCSIDeviceState *s;
715 struct sg_scsi_id scsiid;
716
717 /* check we are really using a /dev/sg* file */
718
719 if (!bdrv_is_sg(bdrv))
720 return NULL;
721
722 /* check we are using a driver managing SG_IO (version 3 and after */
723
724 if (bdrv_ioctl(bdrv, SG_GET_VERSION_NUM, &sg_version) < 0 ||
725 sg_version < 30000)
726 return NULL;
727
728 /* get LUN of the /dev/sg? */
729
730 if (bdrv_ioctl(bdrv, SG_GET_SCSI_ID, &scsiid))
731 return NULL;
732
733 /* define device state */
734
735 s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState));
736 s->bdrv = bdrv;
737 s->requests = NULL;
738 s->completion = completion;
739 s->opaque = opaque;
740 s->lun = scsiid.lun;
741 DPRINTF("LUN %d\n", s->lun);
742 s->type = scsiid.scsi_type;
743 DPRINTF("device type %d\n", s->type);
744 if (s->type == TYPE_TAPE) {
745 s->blocksize = get_stream_blocksize(s->bdrv);
746 if (s->blocksize == -1)
747 s->blocksize = 0;
748 } else {
749 s->blocksize = get_blocksize(s->bdrv);
750 /* removable media returns 0 if not present */
751 if (s->blocksize <= 0) {
752 if (s->type == TYPE_ROM || s->type == TYPE_WORM)
753 s->blocksize = 2048;
754 else
755 s->blocksize = 512;
756 }
757 }
758 DPRINTF("block size %d\n", s->blocksize);
759 s->driver_status = 0;
760 memset(s->sensebuf, 0, sizeof(s->sensebuf));
761
762 /* define function to manage device */
763
764 d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));
765 d->state = s;
766 d->destroy = scsi_destroy;
767 d->send_command = scsi_send_command;
768 d->read_data = scsi_read_data;
769 d->write_data = scsi_write_data;
770 d->cancel_io = scsi_cancel_io;
771 d->get_buf = scsi_get_buf;
772
773 return d;
774 }
775 #endif /* __linux__ */