aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-io.c')
-rw-r--r--drivers/ide/ide-io.c41
1 files changed, 18 insertions, 23 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index 18ac1bd0811f..48c38b68bd36 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -637,32 +637,26 @@ static ide_startstop_t drive_cmd_intr (ide_drive_t *drive)
637 return ide_stopped; 637 return ide_stopped;
638} 638}
639 639
640static void ide_init_specify_cmd(ide_drive_t *drive, ide_task_t *task) 640static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
641{ 641{
642 task->tf.nsect = drive->sect; 642 tf->nsect = drive->sect;
643 task->tf.lbal = drive->sect; 643 tf->lbal = drive->sect;
644 task->tf.lbam = drive->cyl; 644 tf->lbam = drive->cyl;
645 task->tf.lbah = drive->cyl >> 8; 645 tf->lbah = drive->cyl >> 8;
646 task->tf.device = ((drive->head - 1) | drive->select.all) & ~ATA_LBA; 646 tf->device = ((drive->head - 1) | drive->select.all) & ~ATA_LBA;
647 task->tf.command = WIN_SPECIFY; 647 tf->command = WIN_SPECIFY;
648
649 task->handler = &set_geometry_intr;
650} 648}
651 649
652static void ide_init_restore_cmd(ide_drive_t *drive, ide_task_t *task) 650static void ide_tf_set_restore_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
653{ 651{
654 task->tf.nsect = drive->sect; 652 tf->nsect = drive->sect;
655 task->tf.command = WIN_RESTORE; 653 tf->command = WIN_RESTORE;
656
657 task->handler = &recal_intr;
658} 654}
659 655
660static void ide_init_setmult_cmd(ide_drive_t *drive, ide_task_t *task) 656static void ide_tf_set_setmult_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
661{ 657{
662 task->tf.nsect = drive->mult_req; 658 tf->nsect = drive->mult_req;
663 task->tf.command = WIN_SETMULT; 659 tf->command = WIN_SETMULT;
664
665 task->handler = &set_multmode_intr;
666} 660}
667 661
668static ide_startstop_t ide_disk_special(ide_drive_t *drive) 662static ide_startstop_t ide_disk_special(ide_drive_t *drive)
@@ -675,15 +669,15 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive)
675 669
676 if (s->b.set_geometry) { 670 if (s->b.set_geometry) {
677 s->b.set_geometry = 0; 671 s->b.set_geometry = 0;
678 ide_init_specify_cmd(drive, &args); 672 ide_tf_set_specify_cmd(drive, &args.tf);
679 } else if (s->b.recalibrate) { 673 } else if (s->b.recalibrate) {
680 s->b.recalibrate = 0; 674 s->b.recalibrate = 0;
681 ide_init_restore_cmd(drive, &args); 675 ide_tf_set_restore_cmd(drive, &args.tf);
682 } else if (s->b.set_multmode) { 676 } else if (s->b.set_multmode) {
683 s->b.set_multmode = 0; 677 s->b.set_multmode = 0;
684 if (drive->mult_req > drive->id->max_multsect) 678 if (drive->mult_req > drive->id->max_multsect)
685 drive->mult_req = drive->id->max_multsect; 679 drive->mult_req = drive->id->max_multsect;
686 ide_init_setmult_cmd(drive, &args); 680 ide_tf_set_setmult_cmd(drive, &args.tf);
687 } else if (s->all) { 681 } else if (s->all) {
688 int special = s->all; 682 int special = s->all;
689 s->all = 0; 683 s->all = 0;
@@ -691,7 +685,8 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive)
691 return ide_stopped; 685 return ide_stopped;
692 } 686 }
693 687
694 args.tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE; 688 args.tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE |
689 IDE_TFLAG_CUSTOM_HANDLER;
695 690
696 do_rw_taskfile(drive, &args); 691 do_rw_taskfile(drive, &args);
697 692