Revision fa1fb14c hw/esp.c
b/hw/esp.c | ||
---|---|---|
43 | 43 |
|
44 | 44 |
#define ESP_MAXREG 0x3f |
45 | 45 |
#define TI_BUFSZ 32 |
46 |
/* The HBA is ID 7, so for simplicitly limit to 7 devices. */ |
|
47 |
#define ESP_MAX_DEVS 7 |
|
46 | 48 |
|
47 | 49 |
typedef struct ESPState ESPState; |
48 | 50 |
|
... | ... | |
526 | 528 |
return 0; |
527 | 529 |
} |
528 | 530 |
|
531 |
void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) |
|
532 |
{ |
|
533 |
ESPState *s = (ESPState *)opaque; |
|
534 |
|
|
535 |
if (id < 0) { |
|
536 |
for (id = 0; id < ESP_MAX_DEVS; id++) { |
|
537 |
if (s->scsi_dev[id] == NULL) |
|
538 |
break; |
|
539 |
} |
|
540 |
} |
|
541 |
if (id >= ESP_MAX_DEVS) { |
|
542 |
DPRINTF("Bad Device ID %d\n", id); |
|
543 |
return; |
|
544 |
} |
|
545 |
if (s->scsi_dev[id]) { |
|
546 |
DPRINTF("Destroying device %d\n", id); |
|
547 |
scsi_disk_destroy(s->scsi_dev[id]); |
|
548 |
} |
|
549 |
DPRINTF("Attaching block device %d\n", id); |
|
550 |
/* Command queueing is not implemented. */ |
|
551 |
s->scsi_dev[id] = scsi_disk_init(bd, 0, esp_command_complete, s); |
|
552 |
} |
|
553 |
|
|
529 | 554 |
void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque) |
530 | 555 |
{ |
531 | 556 |
ESPState *s; |
532 | 557 |
int esp_io_memory; |
533 |
int i; |
|
534 | 558 |
|
535 | 559 |
s = qemu_mallocz(sizeof(ESPState)); |
536 | 560 |
if (!s) |
... | ... | |
546 | 570 |
|
547 | 571 |
register_savevm("esp", espaddr, 2, esp_save, esp_load, s); |
548 | 572 |
qemu_register_reset(esp_reset, s); |
549 |
for (i = 0; i < MAX_DISKS; i++) { |
|
550 |
if (bs_table[i]) { |
|
551 |
/* Command queueing is not implemented. */ |
|
552 |
s->scsi_dev[i] = |
|
553 |
scsi_disk_init(bs_table[i], 0, esp_command_complete, s); |
|
554 |
} |
|
555 |
} |
|
556 | 573 |
|
557 | 574 |
return s; |
558 | 575 |
} |
Also available in: Unified diff