| 493 | } |
| 494 | |
| 495 | static void ide_exec_cmd(IDEState *s, int val) |
| 496 | { |
| 497 | #if defined(DEBUG_IDE) |
| 498 | printf("ide: exec_cmd=0x%02x\n", val); |
| 499 | #endif |
| 500 | switch(val) { |
| 501 | case WIN_IDENTIFY: |
| 502 | ide_identify(s); |
| 503 | s->status = READY_STAT | SEEK_STAT | DRQ_STAT; |
| 504 | ide_transfer_start(s, 512, ide_identify_cb); |
| 505 | ide_set_irq(s); |
| 506 | break; |
| 507 | case WIN_SPECIFY: |
| 508 | case WIN_RECAL: |
| 509 | s->error = 0; |
| 510 | s->status = READY_STAT | SEEK_STAT; |
| 511 | ide_set_irq(s); |
| 512 | break; |
| 513 | case WIN_SETMULT: |
| 514 | if (s->nsector > MAX_MULT_SECTORS || |
| 515 | (s->nsector & (s->nsector - 1)) != 0) { |
| 516 | ide_abort_command(s); |
| 517 | } else { |
| 518 | s->mult_sectors = s->nsector; |
| 519 | #if defined(DEBUG_IDE) |
| 520 | printf("ide: setmult=%d\n", s->mult_sectors); |
| 521 | #endif |
| 522 | s->status = READY_STAT; |
| 523 | } |
| 524 | ide_set_irq(s); |
| 525 | break; |
| 526 | case WIN_READ: |
| 527 | case WIN_READ_ONCE: |
| 528 | s->req_nb_sectors = 1; |
| 529 | ide_sector_read(s); |
| 530 | break; |
| 531 | case WIN_WRITE: |
| 532 | case WIN_WRITE_ONCE: |
| 533 | s->req_nb_sectors = 1; |
| 534 | ide_sector_write(s); |
| 535 | break; |
| 536 | case WIN_MULTREAD: |
| 537 | if (!s->mult_sectors) { |
| 538 | ide_abort_command(s); |
| 539 | ide_set_irq(s); |
| 540 | } else { |
| 541 | s->req_nb_sectors = s->mult_sectors; |
| 542 | ide_sector_read(s); |
| 543 | } |
| 544 | break; |
| 545 | case WIN_MULTWRITE: |
| 546 | if (!s->mult_sectors) { |
| 547 | ide_abort_command(s); |
| 548 | ide_set_irq(s); |
| 549 | } else { |
| 550 | s->req_nb_sectors = s->mult_sectors; |
| 551 | ide_sector_write(s); |
| 552 | } |
no test coverage detected