ide: use ide_complete_cmd() for head unload commands
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 27 Mar 2009 11:46:41 +0000 (12:46 +0100)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 27 Mar 2009 11:46:41 +0000 (12:46 +0100)
Move handling of head unload commands from task_no_data_intr()
to ide_complete_cmd() and then use ide_complete_cmd() also for
head unload commands.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-io.c
drivers/ide/ide-taskfile.c

index c27eaab1ffcfbe4f528df49264b294e20ab0958d..c33a8006838bf117f07d0beb8a685ce2c6a4cb72 100644 (file)
@@ -147,12 +147,23 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err)
 {
        struct ide_taskfile *tf = &cmd->tf;
        struct request *rq = cmd->rq;
+       u8 tf_cmd = tf->command;
 
        tf->error = err;
        tf->status = stat;
 
        drive->hwif->tp_ops->tf_read(drive, cmd);
 
+       if ((cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) &&
+           tf_cmd == ATA_CMD_IDLEIMMEDIATE) {
+               if (tf->lbal != 0xc4) {
+                       printk(KERN_ERR "%s: head unload failed!\n",
+                              drive->name);
+                       ide_tf_dump(drive->name, tf);
+               } else
+                       drive->dev_flags |= IDE_DFLAG_PARKED;
+       }
+
        if (rq && rq->cmd_type == REQ_TYPE_ATA_TASKFILE)
                memcpy(rq->special, cmd, sizeof(*cmd));
 
index c0268750768263a11f543847e20ac85f22ddc361..4883aa4052ac8dd39d0e005b9871abad60a5446f 100644 (file)
@@ -146,15 +146,7 @@ static ide_startstop_t task_no_data_intr(ide_drive_t *drive)
                return ide_error(drive, "task_no_data_intr", stat);
        }
 
-       if (custom && tf->command == ATA_CMD_IDLEIMMEDIATE) {
-               hwif->tp_ops->tf_read(drive, cmd);
-               if (tf->lbal != 0xc4) {
-                       printk(KERN_ERR "%s: head unload failed!\n",
-                              drive->name);
-                       ide_tf_dump(drive->name, tf);
-               } else
-                       drive->dev_flags |= IDE_DFLAG_PARKED;
-       } else if (custom && tf->command == ATA_CMD_SET_MULTI)
+       if (custom && tf->command == ATA_CMD_SET_MULTI)
                drive->mult_count = drive->mult_req;
 
        if (custom == 0 || tf->command == ATA_CMD_IDLEIMMEDIATE) {
@@ -164,7 +156,8 @@ static ide_startstop_t task_no_data_intr(ide_drive_t *drive)
                if (blk_pm_request(rq))
                        ide_complete_pm_rq(drive, rq);
                else {
-                       if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE)
+                       if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE ||
+                           tf->command == ATA_CMD_IDLEIMMEDIATE)
                                ide_complete_cmd(drive, cmd, stat, err);
                        ide_complete_rq(drive, err);
                }