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