Revision cd8722bb

b/hw/ide/core.c
292 292
    /* put signature */
293 293
    s->nsector = 1;
294 294
    s->sector = 1;
295
    if (s->is_cdrom) {
295
    if (s->drive_kind == IDE_CD) {
296 296
        s->lcyl = 0x14;
297 297
        s->hcyl = 0xeb;
298 298
    } else if (s->bs) {
......
1827 1827

  
1828 1828
        switch(val) {
1829 1829
        case WIN_IDENTIFY:
1830
            if (s->bs && !s->is_cdrom) {
1831
                if (!s->is_cf)
1830
            if (s->bs && s->drive_kind != IDE_CD) {
1831
                if (s->drive_kind != IDE_CFATA)
1832 1832
                    ide_identify(s);
1833 1833
                else
1834 1834
                    ide_cfata_identify(s);
1835 1835
                s->status = READY_STAT | SEEK_STAT;
1836 1836
                ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1837 1837
            } else {
1838
                if (s->is_cdrom) {
1838
                if (s->drive_kind == IDE_CD) {
1839 1839
                    ide_set_signature(s);
1840 1840
                }
1841 1841
                ide_abort_command(s);
......
1849 1849
            ide_set_irq(s->bus);
1850 1850
            break;
1851 1851
        case WIN_SETMULT:
1852
            if (s->is_cf && s->nsector == 0) {
1852
            if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1853 1853
                /* Disable Read and Write Multiple */
1854 1854
                s->mult_sectors = 0;
1855 1855
                s->status = READY_STAT | SEEK_STAT;
......
2033 2033
            ide_set_irq(s->bus);
2034 2034
            break;
2035 2035
        case WIN_SEEK:
2036
            if(s->is_cdrom)
2036
            if(s->drive_kind == IDE_CD)
2037 2037
                goto abort_cmd;
2038 2038
            /* XXX: Check that seek is within bounds */
2039 2039
            s->status = READY_STAT | SEEK_STAT;
......
2041 2041
            break;
2042 2042
            /* ATAPI commands */
2043 2043
        case WIN_PIDENTIFY:
2044
            if (s->is_cdrom) {
2044
            if (s->drive_kind == IDE_CD) {
2045 2045
                ide_atapi_identify(s);
2046 2046
                s->status = READY_STAT | SEEK_STAT;
2047 2047
                ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
......
2052 2052
            break;
2053 2053
        case WIN_DIAGNOSE:
2054 2054
            ide_set_signature(s);
2055
            if (s->is_cdrom)
2055
            if (s->drive_kind == IDE_CD)
2056 2056
                s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
2057 2057
                                * devices to return a clear status register
2058 2058
                                * with READY_STAT *not* set. */
......
2064 2064
            ide_set_irq(s->bus);
2065 2065
            break;
2066 2066
        case WIN_SRST:
2067
            if (!s->is_cdrom)
2067
            if (s->drive_kind != IDE_CD)
2068 2068
                goto abort_cmd;
2069 2069
            ide_set_signature(s);
2070 2070
            s->status = 0x00; /* NOTE: READY is _not_ set */
2071 2071
            s->error = 0x01;
2072 2072
            break;
2073 2073
        case WIN_PACKETCMD:
2074
            if (!s->is_cdrom)
2074
            if (s->drive_kind != IDE_CD)
2075 2075
                goto abort_cmd;
2076 2076
            /* overlapping commands not supported */
2077 2077
            if (s->feature & 0x02)
......
2084 2084
            break;
2085 2085
        /* CF-ATA commands */
2086 2086
        case CFA_REQ_EXT_ERROR_CODE:
2087
            if (!s->is_cf)
2087
            if (s->drive_kind != IDE_CFATA)
2088 2088
                goto abort_cmd;
2089 2089
            s->error = 0x09;    /* miscellaneous error */
2090 2090
            s->status = READY_STAT | SEEK_STAT;
......
2092 2092
            break;
2093 2093
        case CFA_ERASE_SECTORS:
2094 2094
        case CFA_WEAR_LEVEL:
2095
            if (!s->is_cf)
2095
            if (s->drive_kind != IDE_CFATA)
2096 2096
                goto abort_cmd;
2097 2097
            if (val == CFA_WEAR_LEVEL)
2098 2098
                s->nsector = 0;
......
2103 2103
            ide_set_irq(s->bus);
2104 2104
            break;
2105 2105
        case CFA_TRANSLATE_SECTOR:
2106
            if (!s->is_cf)
2106
            if (s->drive_kind != IDE_CFATA)
2107 2107
                goto abort_cmd;
2108 2108
            s->error = 0x00;
2109 2109
            s->status = READY_STAT | SEEK_STAT;
......
2123 2123
            ide_set_irq(s->bus);
2124 2124
            break;
2125 2125
        case CFA_ACCESS_METADATA_STORAGE:
2126
            if (!s->is_cf)
2126
            if (s->drive_kind != IDE_CFATA)
2127 2127
                goto abort_cmd;
2128 2128
            switch (s->feature) {
2129 2129
            case 0x02:	/* Inquiry Metadata Storage */
......
2143 2143
            ide_set_irq(s->bus);
2144 2144
            break;
2145 2145
        case IBM_SENSE_CONDITION:
2146
            if (!s->is_cf)
2146
            if (s->drive_kind != IDE_CFATA)
2147 2147
                goto abort_cmd;
2148 2148
            switch (s->feature) {
2149 2149
            case 0x01:  /* sense temperature in device */
......
2157 2157
            break;
2158 2158

  
2159 2159
	case WIN_SMART:
2160
	    if (s->is_cdrom)
2160
	    if (s->drive_kind == IDE_CD)
2161 2161
		goto abort_cmd;
2162 2162
	    if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
2163 2163
		goto abort_cmd;
......
2438 2438
        /* high to low */
2439 2439
        for(i = 0;i < 2; i++) {
2440 2440
            s = &bus->ifs[i];
2441
            if (s->is_cdrom)
2441
            if (s->drive_kind == IDE_CD)
2442 2442
                s->status = 0x00; /* NOTE: READY is _not_ set */
2443 2443
            else
2444 2444
                s->status = READY_STAT | SEEK_STAT;
......
2540 2540
#ifdef DEBUG_IDE
2541 2541
    printf("ide: reset\n");
2542 2542
#endif
2543
    if (s->is_cf)
2543
    if (s->drive_kind == IDE_CFATA)
2544 2544
        s->mult_sectors = 0;
2545 2545
    else
2546 2546
        s->mult_sectors = MAX_MULT_SECTORS;
......
2614 2614
    s->smart_errors = 0;
2615 2615
    s->smart_selftest_count = 0;
2616 2616
    if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) {
2617
        s->is_cdrom = 1;
2617
        s->drive_kind = IDE_CD;
2618 2618
        bdrv_set_change_cb(bs, cdrom_change_cb, s);
2619 2619
    }
2620 2620
    if (serial) {
......
2629 2629
        pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
2630 2630
    }
2631 2631
    ide_reset(s);
2632
    bdrv_set_removable(bs, s->is_cdrom);
2632
    bdrv_set_removable(bs, s->drive_kind == IDE_CD);
2633 2633
}
2634 2634

  
2635 2635
static void ide_init1(IDEBus *bus, int unit)
b/hw/ide/internal.h
362 362
#define SMART_DISABLE         0xd9
363 363
#define SMART_STATUS          0xda
364 364

  
365
typedef enum { IDE_HD, IDE_CD, IDE_CFATA } IDEDriveKind;
366

  
365 367
typedef void EndTransferFunc(IDEState *);
366 368

  
367 369
/* NOTE: IDEState represents in fact one drive */
......
369 371
    IDEBus *bus;
370 372
    uint8_t unit;
371 373
    /* ide config */
372
    int is_cdrom;
373
    int is_cf;
374
    IDEDriveKind drive_kind;
374 375
    int cylinders, heads, sectors;
375 376
    int64_t nb_sectors;
376 377
    int mult_sectors;
b/hw/ide/macio.c
162 162
    IDEState *s = idebus_active_if(&m->bus);
163 163

  
164 164
    s->io_buffer_size = 0;
165
    if (s->is_cdrom) {
165
    if (s->drive_kind == IDE_CD) {
166 166
        pmac_ide_atapi_transfer_cb(io, 0);
167 167
        return;
168 168
    }
b/hw/ide/microdrive.c
541 541

  
542 542
    ide_init2_with_non_qdev_drives(&md->bus, bdrv, NULL,
543 543
                                   qemu_allocate_irqs(md_set_irq, md, 1)[0]);
544
    md->bus.ifs[0].is_cf = 1;
544
    md->bus.ifs[0].drive_kind = IDE_CFATA;
545 545
    md->bus.ifs[0].mdata_size = METADATA_SIZE;
546 546
    md->bus.ifs[0].mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
547 547

  

Also available in: Unified diff