]> git.hungrycats.org Git - linux/commitdiff
[PATCH] ide: add ide_hwif_t->data_phase
authorBartlomiej Zolnierkiewicz <bzolnier@elka.pw.edu.pl>
Fri, 10 Sep 2004 04:03:44 +0000 (21:03 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 10 Sep 2004 04:03:44 +0000 (21:03 -0700)
Use it for taskfile requests (only PIO/DMA for now) for storing
ide_task_t->data_phase of the active command.

Also add some missing task->data_phase assignments.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@elka.pw.edu.pl>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/ide/ide-disk.c
drivers/ide/ide-io.c
drivers/ide/ide-taskfile.c
include/linux/ide.h

index ed301e7a16d71bdd6658bc5fc34e4589032a5c94..36a0a8f5317f0b983787fc019085a21d340c1d21 100644 (file)
@@ -509,9 +509,11 @@ static u8 get_command(ide_drive_t *drive, struct request *rq, ide_task_t *task)
                if (dma)
                        return lba48 ? WIN_READDMA_EXT : WIN_READDMA;
                if (drive->mult_count) {
+                       task->data_phase = TASKFILE_MULTI_IN;
                        task->handler = &task_mulin_intr;
                        return lba48 ? WIN_MULTREAD_EXT : WIN_MULTREAD;
                }
+               task->data_phase = TASKFILE_IN;
                task->handler = &task_in_intr;
                return lba48 ? WIN_READ_EXT : WIN_READ;
        } else {
@@ -519,10 +521,12 @@ static u8 get_command(ide_drive_t *drive, struct request *rq, ide_task_t *task)
                if (dma)
                        return lba48 ? WIN_WRITEDMA_EXT : WIN_WRITEDMA;
                if (drive->mult_count) {
+                       task->data_phase = TASKFILE_MULTI_OUT;
                        task->prehandler = &pre_task_mulout_intr;
                        task->handler = &task_mulout_intr;
                        return lba48 ? WIN_MULTWRITE_EXT : WIN_MULTWRITE;
                }
+               task->data_phase = TASKFILE_OUT;
                task->prehandler = &pre_task_out_intr;
                task->handler = &task_out_intr;
                return lba48 ? WIN_WRITE_EXT : WIN_WRITE;
@@ -556,6 +560,7 @@ static ide_startstop_t chs_rw_disk (ide_drive_t *drive, struct request *rq, unsi
        args.tfRegister[IDE_COMMAND_OFFSET]     = get_command(drive, rq, &args);
        args.rq                                 = (struct request *) rq;
        rq->special                             = (ide_task_t *)&args;
+       drive->hwif->data_phase = args.data_phase;
        return do_rw_taskfile(drive, &args);
 }
 
@@ -580,6 +585,7 @@ static ide_startstop_t lba_28_rw_disk (ide_drive_t *drive, struct request *rq, u
        args.tfRegister[IDE_COMMAND_OFFSET]     = get_command(drive, rq, &args);
        args.rq                                 = (struct request *) rq;
        rq->special                             = (ide_task_t *)&args;
+       drive->hwif->data_phase = args.data_phase;
        return do_rw_taskfile(drive, &args);
 }
 
@@ -615,6 +621,7 @@ static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, u
        args.hobRegister[IDE_CONTROL_OFFSET_HOB]= (drive->ctl|0x80);
        args.rq                                 = (struct request *) rq;
        rq->special                             = (ide_task_t *)&args;
+       drive->hwif->data_phase = args.data_phase;
        return do_rw_taskfile(drive, &args);
 }
 
@@ -1156,6 +1163,7 @@ static int get_smart_values(ide_drive_t *drive, u8 *buf)
        args.tfRegister[IDE_HCYL_OFFSET]        = SMART_HCYL_PASS;
        args.tfRegister[IDE_COMMAND_OFFSET]     = WIN_SMART;
        args.command_type                       = IDE_DRIVE_TASK_IN;
+       args.data_phase                         = TASKFILE_IN;
        args.handler                            = &task_in_intr;
        (void) smart_enable(drive);
        return ide_raw_taskfile(drive, &args, buf);
index ba620bc0c0e0bbd3d870735f1fcab2370652e2fa..b50ba0257b4c8e867948578c766b9d5eca13e353 100644 (file)
@@ -692,7 +692,9 @@ ide_startstop_t execute_drive_cmd (ide_drive_t *drive, struct request *rq)
  
                if (!args)
                        goto done;
+
+               hwif->data_phase = args->data_phase;
+
                if (args->tf_out_flags.all != 0) 
                        return flagged_taskfile(drive, args);
                return do_rw_taskfile(drive, args);
index e83c9a9eb2280c3da7f41bdf872f1fed14f6e733..affd55a2b66954f3d0cb4a81ed95444d602a7798 100644 (file)
@@ -96,6 +96,7 @@ int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf)
        else
                args.tfRegister[IDE_COMMAND_OFFSET]     = WIN_PIDENTIFY;
        args.command_type = IDE_DRIVE_TASK_IN;
+       args.data_phase   = TASKFILE_IN;
        args.handler      = &task_in_intr;
        return ide_raw_taskfile(drive, &args, buf);
 }
index 6690c37c9304c7e9dbfc710d80a98ace6cf269f3..b39287b1fa5ebef153df4e88fe98c2d0ed4b993b 100644 (file)
@@ -931,6 +931,9 @@ typedef struct hwif_s {
        int sg_dma_direction;           /* dma transfer direction */
        int sg_dma_active;              /* is it in use */
 
+       /* data phase of the active command (currently only valid for PIO/DMA) */
+       int             data_phase;
+
        int             mmio;           /* hosts iomio (0) or custom (2) select */
        int             rqsize;         /* max sectors per request */
        int             irq;            /* our irq number */