Commit 8ccc2ace5628720347017c98a43b47b2ba23cf15
1 parent
cf6d9118
SCSI cleanup, by Laurent Vivier.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3797 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
95 additions
and
67 deletions
hw/esp.c
| ... | ... | @@ -165,7 +165,7 @@ static int get_cmd(ESPState *s, uint8_t *buf) |
| 165 | 165 | |
| 166 | 166 | if (s->current_dev) { |
| 167 | 167 | /* Started a new command before the old one finished. Cancel it. */ |
| 168 | - scsi_cancel_io(s->current_dev, 0); | |
| 168 | + s->current_dev->cancel_io(s->current_dev, 0); | |
| 169 | 169 | s->async_len = 0; |
| 170 | 170 | } |
| 171 | 171 | |
| ... | ... | @@ -188,7 +188,7 @@ static void do_cmd(ESPState *s, uint8_t *buf) |
| 188 | 188 | |
| 189 | 189 | DPRINTF("do_cmd: busid 0x%x\n", buf[0]); |
| 190 | 190 | lun = buf[0] & 7; |
| 191 | - datalen = scsi_send_command(s->current_dev, 0, &buf[1], lun); | |
| 191 | + datalen = s->current_dev->send_command(s->current_dev, 0, &buf[1], lun); | |
| 192 | 192 | s->ti_size = datalen; |
| 193 | 193 | if (datalen != 0) { |
| 194 | 194 | s->rregs[ESP_RSTAT] = STAT_IN | STAT_TC; |
| ... | ... | @@ -196,10 +196,10 @@ static void do_cmd(ESPState *s, uint8_t *buf) |
| 196 | 196 | s->dma_counter = 0; |
| 197 | 197 | if (datalen > 0) { |
| 198 | 198 | s->rregs[ESP_RSTAT] |= STAT_DI; |
| 199 | - scsi_read_data(s->current_dev, 0); | |
| 199 | + s->current_dev->read_data(s->current_dev, 0); | |
| 200 | 200 | } else { |
| 201 | 201 | s->rregs[ESP_RSTAT] |= STAT_DO; |
| 202 | - scsi_write_data(s->current_dev, 0); | |
| 202 | + s->current_dev->write_data(s->current_dev, 0); | |
| 203 | 203 | } |
| 204 | 204 | } |
| 205 | 205 | s->rregs[ESP_RINTR] = INTR_BS | INTR_FC; |
| ... | ... | @@ -298,9 +298,9 @@ static void esp_do_dma(ESPState *s) |
| 298 | 298 | if (s->async_len == 0) { |
| 299 | 299 | if (to_device) { |
| 300 | 300 | // ti_size is negative |
| 301 | - scsi_write_data(s->current_dev, 0); | |
| 301 | + s->current_dev->write_data(s->current_dev, 0); | |
| 302 | 302 | } else { |
| 303 | - scsi_read_data(s->current_dev, 0); | |
| 303 | + s->current_dev->read_data(s->current_dev, 0); | |
| 304 | 304 | /* If there is still data to be read from the device then |
| 305 | 305 | complete the DMA operation immeriately. Otherwise defer |
| 306 | 306 | until the scsi layer has completed. */ |
| ... | ... | @@ -335,7 +335,7 @@ static void esp_command_complete(void *opaque, int reason, uint32_t tag, |
| 335 | 335 | } else { |
| 336 | 336 | DPRINTF("transfer %d/%d\n", s->dma_left, s->ti_size); |
| 337 | 337 | s->async_len = arg; |
| 338 | - s->async_buf = scsi_get_buf(s->current_dev, 0); | |
| 338 | + s->async_buf = s->current_dev->get_buf(s->current_dev, 0); | |
| 339 | 339 | if (s->dma_left) { |
| 340 | 340 | esp_do_dma(s); |
| 341 | 341 | } else if (s->dma_counter != 0 && s->ti_size <= 0) { |
| ... | ... | @@ -611,7 +611,7 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) |
| 611 | 611 | } |
| 612 | 612 | if (s->scsi_dev[id]) { |
| 613 | 613 | DPRINTF("Destroying device %d\n", id); |
| 614 | - scsi_disk_destroy(s->scsi_dev[id]); | |
| 614 | + s->scsi_dev[id]->destroy(s->scsi_dev[id]); | |
| 615 | 615 | } |
| 616 | 616 | DPRINTF("Attaching block device %d\n", id); |
| 617 | 617 | /* Command queueing is not implemented. */ | ... | ... |
hw/lsi53c895a.c
| ... | ... | @@ -187,6 +187,7 @@ typedef struct { |
| 187 | 187 | /* The tag is a combination of the device ID and the SCSI tag. */ |
| 188 | 188 | uint32_t current_tag; |
| 189 | 189 | uint32_t current_dma_len; |
| 190 | + int command_complete; | |
| 190 | 191 | uint8_t *dma_buf; |
| 191 | 192 | lsi_queue *queue; |
| 192 | 193 | int queue_len; |
| ... | ... | @@ -465,7 +466,8 @@ static void lsi_do_dma(LSIState *s, int out) |
| 465 | 466 | s->dbc -= count; |
| 466 | 467 | |
| 467 | 468 | if (s->dma_buf == NULL) { |
| 468 | - s->dma_buf = scsi_get_buf(s->current_dev, s->current_tag); | |
| 469 | + s->dma_buf = s->current_dev->get_buf(s->current_dev, | |
| 470 | + s->current_tag); | |
| 469 | 471 | } |
| 470 | 472 | |
| 471 | 473 | /* ??? Set SFBR to first data byte. */ |
| ... | ... | @@ -479,10 +481,10 @@ static void lsi_do_dma(LSIState *s, int out) |
| 479 | 481 | s->dma_buf = NULL; |
| 480 | 482 | if (out) { |
| 481 | 483 | /* Write the data. */ |
| 482 | - scsi_write_data(s->current_dev, s->current_tag); | |
| 484 | + s->current_dev->write_data(s->current_dev, s->current_tag); | |
| 483 | 485 | } else { |
| 484 | 486 | /* Request any remaining data. */ |
| 485 | - scsi_read_data(s->current_dev, s->current_tag); | |
| 487 | + s->current_dev->read_data(s->current_dev, s->current_tag); | |
| 486 | 488 | } |
| 487 | 489 | } else { |
| 488 | 490 | s->dma_buf += count; |
| ... | ... | @@ -596,6 +598,7 @@ static void lsi_command_complete(void *opaque, int reason, uint32_t tag, |
| 596 | 598 | if (reason == SCSI_REASON_DONE) { |
| 597 | 599 | DPRINTF("Command complete sense=%d\n", (int)arg); |
| 598 | 600 | s->sense = arg; |
| 601 | + s->command_complete = 2; | |
| 599 | 602 | if (s->waiting && s->dbc != 0) { |
| 600 | 603 | /* Raise phase mismatch for short transfers. */ |
| 601 | 604 | lsi_bad_phase(s, out, PHASE_ST); |
| ... | ... | @@ -612,6 +615,7 @@ static void lsi_command_complete(void *opaque, int reason, uint32_t tag, |
| 612 | 615 | } |
| 613 | 616 | DPRINTF("Data ready tag=0x%x len=%d\n", tag, arg); |
| 614 | 617 | s->current_dma_len = arg; |
| 618 | + s->command_complete = 1; | |
| 615 | 619 | if (!s->waiting) |
| 616 | 620 | return; |
| 617 | 621 | if (s->waiting == 1 || s->dbc == 0) { |
| ... | ... | @@ -631,21 +635,30 @@ static void lsi_do_command(LSIState *s) |
| 631 | 635 | s->dbc = 16; |
| 632 | 636 | cpu_physical_memory_read(s->dnad, buf, s->dbc); |
| 633 | 637 | s->sfbr = buf[0]; |
| 634 | - n = scsi_send_command(s->current_dev, s->current_tag, buf, s->current_lun); | |
| 638 | + s->command_complete = 0; | |
| 639 | + n = s->current_dev->send_command(s->current_dev, s->current_tag, buf, | |
| 640 | + s->current_lun); | |
| 635 | 641 | if (n > 0) { |
| 636 | 642 | lsi_set_phase(s, PHASE_DI); |
| 637 | - scsi_read_data(s->current_dev, s->current_tag); | |
| 643 | + s->current_dev->read_data(s->current_dev, s->current_tag); | |
| 638 | 644 | } else if (n < 0) { |
| 639 | 645 | lsi_set_phase(s, PHASE_DO); |
| 640 | - scsi_write_data(s->current_dev, s->current_tag); | |
| 646 | + s->current_dev->write_data(s->current_dev, s->current_tag); | |
| 641 | 647 | } |
| 642 | - if (n && s->current_dma_len == 0) { | |
| 643 | - /* Command did not complete immediately so disconnect. */ | |
| 644 | - lsi_add_msg_byte(s, 2); /* SAVE DATA POINTER */ | |
| 645 | - lsi_add_msg_byte(s, 4); /* DISCONNECT */ | |
| 646 | - lsi_set_phase(s, PHASE_MI); | |
| 647 | - s->msg_action = 1; | |
| 648 | - lsi_queue_command(s); | |
| 648 | + | |
| 649 | + if (!s->command_complete) { | |
| 650 | + if (n) { | |
| 651 | + /* Command did not complete immediately so disconnect. */ | |
| 652 | + lsi_add_msg_byte(s, 2); /* SAVE DATA POINTER */ | |
| 653 | + lsi_add_msg_byte(s, 4); /* DISCONNECT */ | |
| 654 | + /* wait data */ | |
| 655 | + lsi_set_phase(s, PHASE_MI); | |
| 656 | + s->msg_action = 1; | |
| 657 | + lsi_queue_command(s); | |
| 658 | + } else { | |
| 659 | + /* wait command complete */ | |
| 660 | + lsi_set_phase(s, PHASE_DI); | |
| 661 | + } | |
| 649 | 662 | } |
| 650 | 663 | } |
| 651 | 664 | |
| ... | ... | @@ -1822,7 +1835,7 @@ void lsi_scsi_attach(void *opaque, BlockDriverState *bd, int id) |
| 1822 | 1835 | } |
| 1823 | 1836 | if (s->scsi_dev[id]) { |
| 1824 | 1837 | DPRINTF("Destroying device %d\n", id); |
| 1825 | - scsi_disk_destroy(s->scsi_dev[id]); | |
| 1838 | + s->scsi_dev[id]->destroy(s->scsi_dev[id]); | |
| 1826 | 1839 | } |
| 1827 | 1840 | DPRINTF("Attaching block device %d\n", id); |
| 1828 | 1841 | s->scsi_dev[id] = scsi_disk_init(bd, 1, lsi_command_complete, s); | ... | ... |
hw/scsi-disk.c
| ... | ... | @@ -37,7 +37,7 @@ do { fprintf(stderr, "scsi-disk: " fmt , ##args); } while (0) |
| 37 | 37 | #define SCSI_DMA_BUF_SIZE 65536 |
| 38 | 38 | |
| 39 | 39 | typedef struct SCSIRequest { |
| 40 | - SCSIDevice *dev; | |
| 40 | + SCSIDeviceState *dev; | |
| 41 | 41 | uint32_t tag; |
| 42 | 42 | /* ??? We should probably keep track of whether the data trasfer is |
| 43 | 43 | a read or a write. Currently we rely on the host getting it right. */ |
| ... | ... | @@ -51,7 +51,7 @@ typedef struct SCSIRequest { |
| 51 | 51 | struct SCSIRequest *next; |
| 52 | 52 | } SCSIRequest; |
| 53 | 53 | |
| 54 | -struct SCSIDevice | |
| 54 | +struct SCSIDeviceState | |
| 55 | 55 | { |
| 56 | 56 | BlockDriverState *bdrv; |
| 57 | 57 | SCSIRequest *requests; |
| ... | ... | @@ -69,7 +69,7 @@ struct SCSIDevice |
| 69 | 69 | /* Global pool of SCSIRequest structures. */ |
| 70 | 70 | static SCSIRequest *free_requests = NULL; |
| 71 | 71 | |
| 72 | -static SCSIRequest *scsi_new_request(SCSIDevice *s, uint32_t tag) | |
| 72 | +static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag) | |
| 73 | 73 | { |
| 74 | 74 | SCSIRequest *r; |
| 75 | 75 | |
| ... | ... | @@ -93,7 +93,7 @@ static SCSIRequest *scsi_new_request(SCSIDevice *s, uint32_t tag) |
| 93 | 93 | static void scsi_remove_request(SCSIRequest *r) |
| 94 | 94 | { |
| 95 | 95 | SCSIRequest *last; |
| 96 | - SCSIDevice *s = r->dev; | |
| 96 | + SCSIDeviceState *s = r->dev; | |
| 97 | 97 | |
| 98 | 98 | if (s->requests == r) { |
| 99 | 99 | s->requests = r->next; |
| ... | ... | @@ -111,7 +111,7 @@ static void scsi_remove_request(SCSIRequest *r) |
| 111 | 111 | free_requests = r; |
| 112 | 112 | } |
| 113 | 113 | |
| 114 | -static SCSIRequest *scsi_find_request(SCSIDevice *s, uint32_t tag) | |
| 114 | +static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag) | |
| 115 | 115 | { |
| 116 | 116 | SCSIRequest *r; |
| 117 | 117 | |
| ... | ... | @@ -125,7 +125,7 @@ static SCSIRequest *scsi_find_request(SCSIDevice *s, uint32_t tag) |
| 125 | 125 | /* Helper function for command completion. */ |
| 126 | 126 | static void scsi_command_complete(SCSIRequest *r, int sense) |
| 127 | 127 | { |
| 128 | - SCSIDevice *s = r->dev; | |
| 128 | + SCSIDeviceState *s = r->dev; | |
| 129 | 129 | uint32_t tag; |
| 130 | 130 | DPRINTF("Command complete tag=0x%x sense=%d\n", r->tag, sense); |
| 131 | 131 | s->sense = sense; |
| ... | ... | @@ -135,8 +135,9 @@ static void scsi_command_complete(SCSIRequest *r, int sense) |
| 135 | 135 | } |
| 136 | 136 | |
| 137 | 137 | /* Cancel a pending data transfer. */ |
| 138 | -void scsi_cancel_io(SCSIDevice *s, uint32_t tag) | |
| 138 | +static void scsi_cancel_io(SCSIDevice *d, uint32_t tag) | |
| 139 | 139 | { |
| 140 | + SCSIDeviceState *s = d->state; | |
| 140 | 141 | SCSIRequest *r; |
| 141 | 142 | DPRINTF("Cancel tag=0x%x\n", tag); |
| 142 | 143 | r = scsi_find_request(s, tag); |
| ... | ... | @@ -151,7 +152,7 @@ void scsi_cancel_io(SCSIDevice *s, uint32_t tag) |
| 151 | 152 | static void scsi_read_complete(void * opaque, int ret) |
| 152 | 153 | { |
| 153 | 154 | SCSIRequest *r = (SCSIRequest *)opaque; |
| 154 | - SCSIDevice *s = r->dev; | |
| 155 | + SCSIDeviceState *s = r->dev; | |
| 155 | 156 | |
| 156 | 157 | if (ret) { |
| 157 | 158 | DPRINTF("IO error\n"); |
| ... | ... | @@ -164,8 +165,9 @@ static void scsi_read_complete(void * opaque, int ret) |
| 164 | 165 | } |
| 165 | 166 | |
| 166 | 167 | /* Read more data from scsi device into buffer. */ |
| 167 | -void scsi_read_data(SCSIDevice *s, uint32_t tag) | |
| 168 | +static void scsi_read_data(SCSIDevice *d, uint32_t tag) | |
| 168 | 169 | { |
| 170 | + SCSIDeviceState *s = d->state; | |
| 169 | 171 | SCSIRequest *r; |
| 170 | 172 | uint32_t n; |
| 171 | 173 | |
| ... | ... | @@ -204,7 +206,7 @@ void scsi_read_data(SCSIDevice *s, uint32_t tag) |
| 204 | 206 | static void scsi_write_complete(void * opaque, int ret) |
| 205 | 207 | { |
| 206 | 208 | SCSIRequest *r = (SCSIRequest *)opaque; |
| 207 | - SCSIDevice *s = r->dev; | |
| 209 | + SCSIDeviceState *s = r->dev; | |
| 208 | 210 | uint32_t len; |
| 209 | 211 | |
| 210 | 212 | if (ret) { |
| ... | ... | @@ -228,8 +230,9 @@ static void scsi_write_complete(void * opaque, int ret) |
| 228 | 230 | |
| 229 | 231 | /* Write data to a scsi device. Returns nonzero on failure. |
| 230 | 232 | The transfer may complete asynchronously. */ |
| 231 | -int scsi_write_data(SCSIDevice *s, uint32_t tag) | |
| 233 | +static int scsi_write_data(SCSIDevice *d, uint32_t tag) | |
| 232 | 234 | { |
| 235 | + SCSIDeviceState *s = d->state; | |
| 233 | 236 | SCSIRequest *r; |
| 234 | 237 | uint32_t n; |
| 235 | 238 | |
| ... | ... | @@ -259,8 +262,9 @@ int scsi_write_data(SCSIDevice *s, uint32_t tag) |
| 259 | 262 | } |
| 260 | 263 | |
| 261 | 264 | /* Return a pointer to the data buffer. */ |
| 262 | -uint8_t *scsi_get_buf(SCSIDevice *s, uint32_t tag) | |
| 265 | +static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag) | |
| 263 | 266 | { |
| 267 | + SCSIDeviceState *s = d->state; | |
| 264 | 268 | SCSIRequest *r; |
| 265 | 269 | |
| 266 | 270 | r = scsi_find_request(s, tag); |
| ... | ... | @@ -276,8 +280,10 @@ uint8_t *scsi_get_buf(SCSIDevice *s, uint32_t tag) |
| 276 | 280 | (eg. disk reads), negative for transfers to the device (eg. disk writes), |
| 277 | 281 | and zero if the command does not transfer any data. */ |
| 278 | 282 | |
| 279 | -int32_t scsi_send_command(SCSIDevice *s, uint32_t tag, uint8_t *buf, int lun) | |
| 283 | +static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, | |
| 284 | + uint8_t *buf, int lun) | |
| 280 | 285 | { |
| 286 | + SCSIDeviceState *s = d->state; | |
| 281 | 287 | int64_t nb_sectors; |
| 282 | 288 | uint32_t lba; |
| 283 | 289 | uint32_t len; |
| ... | ... | @@ -291,7 +297,7 @@ int32_t scsi_send_command(SCSIDevice *s, uint32_t tag, uint8_t *buf, int lun) |
| 291 | 297 | r = scsi_find_request(s, tag); |
| 292 | 298 | if (r) { |
| 293 | 299 | BADF("Tag 0x%x already in use\n", tag); |
| 294 | - scsi_cancel_io(s, tag); | |
| 300 | + scsi_cancel_io(d, tag); | |
| 295 | 301 | } |
| 296 | 302 | /* ??? Tags are not unique for different luns. We only implement a |
| 297 | 303 | single lun, so this should not matter. */ |
| ... | ... | @@ -576,19 +582,19 @@ int32_t scsi_send_command(SCSIDevice *s, uint32_t tag, uint8_t *buf, int lun) |
| 576 | 582 | } |
| 577 | 583 | } |
| 578 | 584 | |
| 579 | -void scsi_disk_destroy(SCSIDevice *s) | |
| 585 | +static void scsi_destroy(SCSIDevice *d) | |
| 580 | 586 | { |
| 581 | - qemu_free(s); | |
| 587 | + qemu_free(d->state); | |
| 588 | + qemu_free(d); | |
| 582 | 589 | } |
| 583 | 590 | |
| 584 | -SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, | |
| 585 | - int tcq, | |
| 586 | - scsi_completionfn completion, | |
| 587 | - void *opaque) | |
| 591 | +SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, int tcq, | |
| 592 | + scsi_completionfn completion, void *opaque) | |
| 588 | 593 | { |
| 589 | - SCSIDevice *s; | |
| 594 | + SCSIDevice *d; | |
| 595 | + SCSIDeviceState *s; | |
| 590 | 596 | |
| 591 | - s = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice)); | |
| 597 | + s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState)); | |
| 592 | 598 | s->bdrv = bdrv; |
| 593 | 599 | s->tcq = tcq; |
| 594 | 600 | s->completion = completion; |
| ... | ... | @@ -599,6 +605,14 @@ SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, |
| 599 | 605 | s->cluster_size = 1; |
| 600 | 606 | } |
| 601 | 607 | |
| 602 | - return s; | |
| 603 | -} | |
| 608 | + d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice)); | |
| 609 | + d->state = s; | |
| 610 | + d->destroy = scsi_destroy; | |
| 611 | + d->send_command = scsi_send_command; | |
| 612 | + d->read_data = scsi_read_data; | |
| 613 | + d->write_data = scsi_write_data; | |
| 614 | + d->cancel_io = scsi_cancel_io; | |
| 615 | + d->get_buf = scsi_get_buf; | |
| 604 | 616 | |
| 617 | + return d; | |
| 618 | +} | ... | ... |
hw/scsi-disk.h
| ... | ... | @@ -7,24 +7,25 @@ enum scsi_reason { |
| 7 | 7 | SCSI_REASON_DATA /* Transfer complete, more data required. */ |
| 8 | 8 | }; |
| 9 | 9 | |
| 10 | +typedef struct SCSIDeviceState SCSIDeviceState; | |
| 10 | 11 | typedef struct SCSIDevice SCSIDevice; |
| 11 | 12 | typedef void (*scsi_completionfn)(void *opaque, int reason, uint32_t tag, |
| 12 | 13 | uint32_t arg); |
| 13 | 14 | |
| 14 | -SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, | |
| 15 | - int tcq, | |
| 16 | - scsi_completionfn completion, | |
| 17 | - void *opaque); | |
| 18 | -void scsi_disk_destroy(SCSIDevice *s); | |
| 15 | +struct SCSIDevice | |
| 16 | +{ | |
| 17 | + SCSIDeviceState *state; | |
| 18 | + void (*destroy)(SCSIDevice *s); | |
| 19 | + int32_t (*send_command)(SCSIDevice *s, uint32_t tag, uint8_t *buf, | |
| 20 | + int lun); | |
| 21 | + void (*read_data)(SCSIDevice *s, uint32_t tag); | |
| 22 | + int (*write_data)(SCSIDevice *s, uint32_t tag); | |
| 23 | + void (*cancel_io)(SCSIDevice *s, uint32_t tag); | |
| 24 | + uint8_t *(*get_buf)(SCSIDevice *s, uint32_t tag); | |
| 25 | +}; | |
| 19 | 26 | |
| 20 | -int32_t scsi_send_command(SCSIDevice *s, uint32_t tag, uint8_t *buf, int lun); | |
| 21 | -/* SCSI data transfers are asynchrnonous. However, unlike the block IO | |
| 22 | - layer the completion routine may be called directly by | |
| 23 | - scsi_{read,write}_data. */ | |
| 24 | -void scsi_read_data(SCSIDevice *s, uint32_t tag); | |
| 25 | -int scsi_write_data(SCSIDevice *s, uint32_t tag); | |
| 26 | -void scsi_cancel_io(SCSIDevice *s, uint32_t tag); | |
| 27 | -uint8_t *scsi_get_buf(SCSIDevice *s, uint32_t tag); | |
| 27 | +SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, int tcq, | |
| 28 | + scsi_completionfn completion, void *opaque); | |
| 28 | 29 | |
| 29 | 30 | /* cdrom.c */ |
| 30 | 31 | int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track); | ... | ... |
hw/usb-msd.c
| ... | ... | @@ -149,9 +149,9 @@ static void usb_msd_copy_data(MSDState *s) |
| 149 | 149 | s->data_len -= len; |
| 150 | 150 | if (s->scsi_len == 0) { |
| 151 | 151 | if (s->mode == USB_MSDM_DATAIN) { |
| 152 | - scsi_read_data(s->scsi_dev, s->tag); | |
| 152 | + s->scsi_dev->read_data(s->scsi_dev, s->tag); | |
| 153 | 153 | } else if (s->mode == USB_MSDM_DATAOUT) { |
| 154 | - scsi_write_data(s->scsi_dev, s->tag); | |
| 154 | + s->scsi_dev->write_data(s->scsi_dev, s->tag); | |
| 155 | 155 | } |
| 156 | 156 | } |
| 157 | 157 | } |
| ... | ... | @@ -204,7 +204,7 @@ static void usb_msd_command_complete(void *opaque, int reason, uint32_t tag, |
| 204 | 204 | return; |
| 205 | 205 | } |
| 206 | 206 | s->scsi_len = arg; |
| 207 | - s->scsi_buf = scsi_get_buf(s->scsi_dev, tag); | |
| 207 | + s->scsi_buf = s->scsi_dev->get_buf(s->scsi_dev, tag); | |
| 208 | 208 | if (p) { |
| 209 | 209 | usb_msd_copy_data(s); |
| 210 | 210 | if (s->usb_len == 0) { |
| ... | ... | @@ -342,7 +342,7 @@ static int usb_msd_handle_control(USBDevice *dev, int request, int value, |
| 342 | 342 | static void usb_msd_cancel_io(USBPacket *p, void *opaque) |
| 343 | 343 | { |
| 344 | 344 | MSDState *s = opaque; |
| 345 | - scsi_cancel_io(s->scsi_dev, s->tag); | |
| 345 | + s->scsi_dev->cancel_io(s->scsi_dev, s->tag); | |
| 346 | 346 | s->packet = NULL; |
| 347 | 347 | s->scsi_len = 0; |
| 348 | 348 | } |
| ... | ... | @@ -390,14 +390,14 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket *p) |
| 390 | 390 | DPRINTF("Command tag 0x%x flags %08x len %d data %d\n", |
| 391 | 391 | s->tag, cbw.flags, cbw.cmd_len, s->data_len); |
| 392 | 392 | s->residue = 0; |
| 393 | - scsi_send_command(s->scsi_dev, s->tag, cbw.cmd, 0); | |
| 393 | + s->scsi_dev->send_command(s->scsi_dev, s->tag, cbw.cmd, 0); | |
| 394 | 394 | /* ??? Should check that USB and SCSI data transfer |
| 395 | 395 | directions match. */ |
| 396 | 396 | if (s->residue == 0) { |
| 397 | 397 | if (s->mode == USB_MSDM_DATAIN) { |
| 398 | - scsi_read_data(s->scsi_dev, s->tag); | |
| 398 | + s->scsi_dev->read_data(s->scsi_dev, s->tag); | |
| 399 | 399 | } else if (s->mode == USB_MSDM_DATAOUT) { |
| 400 | - scsi_write_data(s->scsi_dev, s->tag); | |
| 400 | + s->scsi_dev->write_data(s->scsi_dev, s->tag); | |
| 401 | 401 | } |
| 402 | 402 | } |
| 403 | 403 | ret = len; |
| ... | ... | @@ -508,7 +508,7 @@ static void usb_msd_handle_destroy(USBDevice *dev) |
| 508 | 508 | { |
| 509 | 509 | MSDState *s = (MSDState *)dev; |
| 510 | 510 | |
| 511 | - scsi_disk_destroy(s->scsi_dev); | |
| 511 | + s->scsi_dev->destroy(s->scsi_dev); | |
| 512 | 512 | bdrv_delete(s->bs); |
| 513 | 513 | qemu_free(s); |
| 514 | 514 | } | ... | ... |