Revision 0e6498ed hw/ide/core.c

b/hw/ide/core.c
1110 1110
    return false;
1111 1111
}
1112 1112

  
1113
static bool cmd_read_pio(IDEState *s, uint8_t cmd)
1114
{
1115
    bool lba48 = (cmd == WIN_READ_EXT);
1116

  
1117
    if (s->drive_kind == IDE_CD) {
1118
        ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1119
        ide_abort_command(s);
1120
        return true;
1121
    }
1122

  
1123
    if (!s->bs) {
1124
        ide_abort_command(s);
1125
        return true;
1126
    }
1127

  
1128
    ide_cmd_lba48_transform(s, lba48);
1129
    s->req_nb_sectors = 1;
1130
    ide_sector_read(s);
1131

  
1132
    return false;
1133
}
1134

  
1135
static bool cmd_write_pio(IDEState *s, uint8_t cmd)
1136
{
1137
    bool lba48 = (cmd == WIN_WRITE_EXT);
1138

  
1139
    if (!s->bs) {
1140
        ide_abort_command(s);
1141
        return true;
1142
    }
1143

  
1144
    ide_cmd_lba48_transform(s, lba48);
1145

  
1146
    s->req_nb_sectors = 1;
1147
    s->status = SEEK_STAT | READY_STAT;
1148
    ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1149

  
1150
    s->media_changed = 1;
1151

  
1152
    return false;
1153
}
1154

  
1113 1155
#define HD_OK (1u << IDE_HD)
1114 1156
#define CD_OK (1u << IDE_CD)
1115 1157
#define CFA_OK (1u << IDE_CFATA)
......
1130 1172
    [WIN_DSM]                     = { cmd_data_set_management, ALL_OK },
1131 1173
    [WIN_DEVICE_RESET]            = { NULL, CD_OK },
1132 1174
    [WIN_RECAL]                   = { cmd_nop, HD_CFA_OK | SET_DSC},
1133
    [WIN_READ]                    = { NULL, ALL_OK },
1134
    [WIN_READ_ONCE]               = { NULL, ALL_OK },
1135
    [WIN_READ_EXT]                = { NULL, HD_CFA_OK },
1175
    [WIN_READ]                    = { cmd_read_pio, ALL_OK },
1176
    [WIN_READ_ONCE]               = { cmd_read_pio, ALL_OK },
1177
    [WIN_READ_EXT]                = { cmd_read_pio, HD_CFA_OK },
1136 1178
    [WIN_READDMA_EXT]             = { NULL, HD_CFA_OK },
1137 1179
    [WIN_READ_NATIVE_MAX_EXT]     = { NULL, HD_CFA_OK },
1138 1180
    [WIN_MULTREAD_EXT]            = { cmd_read_multiple, HD_CFA_OK },
1139
    [WIN_WRITE]                   = { NULL, HD_CFA_OK },
1140
    [WIN_WRITE_ONCE]              = { NULL, HD_CFA_OK },
1141
    [WIN_WRITE_EXT]               = { NULL, HD_CFA_OK },
1181
    [WIN_WRITE]                   = { cmd_write_pio, HD_CFA_OK },
1182
    [WIN_WRITE_ONCE]              = { cmd_write_pio, HD_CFA_OK },
1183
    [WIN_WRITE_EXT]               = { cmd_write_pio, HD_CFA_OK },
1142 1184
    [WIN_WRITEDMA_EXT]            = { NULL, HD_CFA_OK },
1143
    [CFA_WRITE_SECT_WO_ERASE]     = { NULL, CFA_OK },
1185
    [CFA_WRITE_SECT_WO_ERASE]     = { cmd_write_pio, CFA_OK },
1144 1186
    [WIN_MULTWRITE_EXT]           = { cmd_write_multiple, HD_CFA_OK },
1145
    [WIN_WRITE_VERIFY]            = { NULL, HD_CFA_OK },
1187
    [WIN_WRITE_VERIFY]            = { cmd_write_pio, HD_CFA_OK },
1146 1188
    [WIN_VERIFY]                  = { cmd_verify, HD_CFA_OK | SET_DSC },
1147 1189
    [WIN_VERIFY_ONCE]             = { cmd_verify, HD_CFA_OK | SET_DSC },
1148 1190
    [WIN_VERIFY_EXT]              = { cmd_verify, HD_CFA_OK | SET_DSC },
......
1235 1277
    }
1236 1278

  
1237 1279
    switch(val) {
1238
    case WIN_READ_EXT:
1239
        lba48 = 1;
1240
        /* fall through */
1241
    case WIN_READ:
1242
    case WIN_READ_ONCE:
1243
        if (s->drive_kind == IDE_CD) {
1244
            ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1245
            goto abort_cmd;
1246
        }
1247
        if (!s->bs) {
1248
            goto abort_cmd;
1249
        }
1250
	ide_cmd_lba48_transform(s, lba48);
1251
        s->req_nb_sectors = 1;
1252
        ide_sector_read(s);
1253
        break;
1254

  
1255
    case WIN_WRITE_EXT:
1256
        lba48 = 1;
1257
        /* fall through */
1258
    case WIN_WRITE:
1259
    case WIN_WRITE_ONCE:
1260
    case CFA_WRITE_SECT_WO_ERASE:
1261
    case WIN_WRITE_VERIFY:
1262
        if (!s->bs) {
1263
            goto abort_cmd;
1264
        }
1265
	ide_cmd_lba48_transform(s, lba48);
1266
        s->error = 0;
1267
        s->status = SEEK_STAT | READY_STAT;
1268
        s->req_nb_sectors = 1;
1269
        ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1270
        s->media_changed = 1;
1271
        break;
1272

  
1273 1280
    case WIN_READDMA_EXT:
1274 1281
        lba48 = 1;
1275 1282
        /* fall through */

Also available in: Unified diff