aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ide/ide-disk.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
index 65c499aab664..7ea075299bd9 100644
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
@@ -580,6 +580,19 @@ static int set_nowerr(ide_drive_t *drive, int arg)
580 return 0; 580 return 0;
581} 581}
582 582
583static int ide_do_setfeature(ide_drive_t *drive, u8 feature, u8 nsect)
584{
585 ide_task_t task;
586
587 memset(&task, 0, sizeof(task));
588 task.tf.feature = feature;
589 task.tf.nsect = nsect;
590 task.tf.command = ATA_CMD_SET_FEATURES;
591 task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
592
593 return ide_no_data_taskfile(drive, &task);
594}
595
583static void update_ordered(ide_drive_t *drive) 596static void update_ordered(ide_drive_t *drive)
584{ 597{
585 u16 *id = drive->id; 598 u16 *id = drive->id;
@@ -619,19 +632,14 @@ ide_devset_get(wcache, wcache);
619 632
620static int set_wcache(ide_drive_t *drive, int arg) 633static int set_wcache(ide_drive_t *drive, int arg)
621{ 634{
622 ide_task_t args;
623 int err = 1; 635 int err = 1;
624 636
625 if (arg < 0 || arg > 1) 637 if (arg < 0 || arg > 1)
626 return -EINVAL; 638 return -EINVAL;
627 639
628 if (ata_id_flush_enabled(drive->id)) { 640 if (ata_id_flush_enabled(drive->id)) {
629 memset(&args, 0, sizeof(ide_task_t)); 641 err = ide_do_setfeature(drive,
630 args.tf.feature = arg ? 642 arg ? SETFEATURES_WC_ON : SETFEATURES_WC_OFF, 0);
631 SETFEATURES_WC_ON : SETFEATURES_WC_OFF;
632 args.tf.command = ATA_CMD_SET_FEATURES;
633 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
634 err = ide_no_data_taskfile(drive, &args);
635 if (err == 0) 643 if (err == 0)
636 drive->wcache = arg; 644 drive->wcache = arg;
637 } 645 }
@@ -658,18 +666,14 @@ ide_devset_get(acoustic, acoustic);
658 666
659static int set_acoustic(ide_drive_t *drive, int arg) 667static int set_acoustic(ide_drive_t *drive, int arg)
660{ 668{
661 ide_task_t args;
662
663 if (arg < 0 || arg > 254) 669 if (arg < 0 || arg > 254)
664 return -EINVAL; 670 return -EINVAL;
665 671
666 memset(&args, 0, sizeof(ide_task_t)); 672 ide_do_setfeature(drive,
667 args.tf.feature = arg ? SETFEATURES_AAM_ON : SETFEATURES_AAM_OFF; 673 arg ? SETFEATURES_AAM_ON : SETFEATURES_AAM_OFF, arg);
668 args.tf.nsect = arg; 674
669 args.tf.command = ATA_CMD_SET_FEATURES;
670 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
671 ide_no_data_taskfile(drive, &args);
672 drive->acoustic = arg; 675 drive->acoustic = arg;
676
673 return 0; 677 return 0;
674} 678}
675 679