Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=57d7366b78b74a9eef873e8212c03d8c2033a764
Commit:     57d7366b78b74a9eef873e8212c03d8c2033a764
Parent:     1192e528e064ebb9a578219731d2b0f78ca3c1ec
Author:     Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
AuthorDate: Fri Jan 25 22:17:16 2008 +0100
Committer:  Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
CommitDate: Fri Jan 25 22:17:16 2008 +0100

    ide: remove 'handler' field from ide_task_t (take 2)
    
    * Add IDE_TFLAG_CUSTOM_HANDLER taskfile flag and use it for internal 
requests
      which require custom handlers.  Check the flag in do_rw_taskfile() and set
      handler accordingly.
    
    * Cleanup ide_init_{specify,restore,setmult}_cmd() and rename it to
      ide_tf_set_{specify,restore,setmult}_cmd().
    
    * Make {set_geometry,recal,set_multmode}_intr() static.
    
    * Remove no longer needed 'handler' field from ide_task_t.
    
    v2:
    * 'handler' in do_rw_taskfile() must be set to NULL initially.
    
    There should be no functionality changes caused by this patch.
    
    Acked-by: Sergei Shtylyov <[EMAIL PROTECTED]>
    Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
---
 drivers/ide/ide-io.c       |   41 ++++++++++++++++++-----------------------
 drivers/ide/ide-taskfile.c |   28 +++++++++++++++++++---------
 include/linux/ide.h        |    5 +----
 3 files changed, 38 insertions(+), 36 deletions(-)

diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index 18ac1bd..48c38b6 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)
        return ide_stopped;
 }
 
-static void ide_init_specify_cmd(ide_drive_t *drive, ide_task_t *task)
+static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
 {
-       task->tf.nsect   = drive->sect;
-       task->tf.lbal    = drive->sect;
-       task->tf.lbam    = drive->cyl;
-       task->tf.lbah    = drive->cyl >> 8;
-       task->tf.device  = ((drive->head - 1) | drive->select.all) & ~ATA_LBA;
-       task->tf.command = WIN_SPECIFY;
-
-       task->handler = &set_geometry_intr;
+       tf->nsect   = drive->sect;
+       tf->lbal    = drive->sect;
+       tf->lbam    = drive->cyl;
+       tf->lbah    = drive->cyl >> 8;
+       tf->device  = ((drive->head - 1) | drive->select.all) & ~ATA_LBA;
+       tf->command = WIN_SPECIFY;
 }
 
-static void ide_init_restore_cmd(ide_drive_t *drive, ide_task_t *task)
+static void ide_tf_set_restore_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
 {
-       task->tf.nsect   = drive->sect;
-       task->tf.command = WIN_RESTORE;
-
-       task->handler = &recal_intr;
+       tf->nsect   = drive->sect;
+       tf->command = WIN_RESTORE;
 }
 
-static void ide_init_setmult_cmd(ide_drive_t *drive, ide_task_t *task)
+static void ide_tf_set_setmult_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
 {
-       task->tf.nsect   = drive->mult_req;
-       task->tf.command = WIN_SETMULT;
-
-       task->handler = &set_multmode_intr;
+       tf->nsect   = drive->mult_req;
+       tf->command = WIN_SETMULT;
 }
 
 static 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)
 
        if (s->b.set_geometry) {
                s->b.set_geometry = 0;
-               ide_init_specify_cmd(drive, &args);
+               ide_tf_set_specify_cmd(drive, &args.tf);
        } else if (s->b.recalibrate) {
                s->b.recalibrate = 0;
-               ide_init_restore_cmd(drive, &args);
+               ide_tf_set_restore_cmd(drive, &args.tf);
        } else if (s->b.set_multmode) {
                s->b.set_multmode = 0;
                if (drive->mult_req > drive->id->max_multsect)
                        drive->mult_req = drive->id->max_multsect;
-               ide_init_setmult_cmd(drive, &args);
+               ide_tf_set_setmult_cmd(drive, &args.tf);
        } else if (s->all) {
                int special = s->all;
                s->all = 0;
@@ -691,7 +685,8 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive)
                return ide_stopped;
        }
 
-       args.tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE;
+       args.tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE |
+                       IDE_TFLAG_CUSTOM_HANDLER;
 
        do_rw_taskfile(drive, &args);
 
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index 835465d..236f91f 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -151,12 +151,15 @@ static int inline task_dma_ok(ide_task_t *task)
 }
 
 static ide_startstop_t task_no_data_intr(ide_drive_t *);
-static ide_startstop_t task_out_intr(ide_drive_t *);
+static ide_startstop_t set_geometry_intr(ide_drive_t *);
+static ide_startstop_t recal_intr(ide_drive_t *);
+static ide_startstop_t set_multmode_intr(ide_drive_t *);
 
 ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
 {
        ide_hwif_t *hwif        = HWIF(drive);
        struct ide_taskfile *tf = &task->tf;
+       ide_handler_t *handler = NULL;
 
        if (task->data_phase == TASKFILE_MULTI_IN ||
            task->data_phase == TASKFILE_MULTI_OUT) {
@@ -175,19 +178,26 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, 
ide_task_t *task)
        switch (task->data_phase) {
        case TASKFILE_MULTI_OUT:
        case TASKFILE_OUT:
-               task->handler = task_out_intr;
                hwif->OUTBSYNC(drive, tf->command, IDE_COMMAND_REG);
                ndelay(400);    /* FIXME */
                return pre_task_out_intr(drive, task->rq);
        case TASKFILE_MULTI_IN:
        case TASKFILE_IN:
-               task->handler = task_in_intr;
+               handler = task_in_intr;
                /* fall-through */
        case TASKFILE_NO_DATA:
+               if (handler == NULL)
+                       handler = task_no_data_intr;
                /* WIN_{SPECIFY,RESTORE,SETMULT} use custom handlers */
-               if (task->handler == NULL)
-                       task->handler = task_no_data_intr;
-               ide_execute_command(drive, tf->command, task->handler, 
WAIT_WORSTCASE, NULL);
+               if (task->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) {
+                       switch (tf->command) {
+                       case WIN_SPECIFY: handler = set_geometry_intr;  break;
+                       case WIN_RESTORE: handler = recal_intr;         break;
+                       case WIN_SETMULT: handler = set_multmode_intr;  break;
+                       }
+               }
+               ide_execute_command(drive, tf->command, handler,
+                                   WAIT_WORSTCASE, NULL);
                return ide_started;
        default:
                if (task_dma_ok(task) == 0 || drive->using_dma == 0 ||
@@ -202,7 +212,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, 
ide_task_t *task)
 /*
  * set_multmode_intr() is invoked on completion of a WIN_SETMULT cmd.
  */
-ide_startstop_t set_multmode_intr (ide_drive_t *drive)
+static ide_startstop_t set_multmode_intr(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = HWIF(drive);
        u8 stat;
@@ -220,7 +230,7 @@ ide_startstop_t set_multmode_intr (ide_drive_t *drive)
 /*
  * set_geometry_intr() is invoked on completion of a WIN_SPECIFY cmd.
  */
-ide_startstop_t set_geometry_intr (ide_drive_t *drive)
+static ide_startstop_t set_geometry_intr(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = HWIF(drive);
        int retries = 5;
@@ -243,7 +253,7 @@ ide_startstop_t set_geometry_intr (ide_drive_t *drive)
 /*
  * recal_intr() is invoked on completion of a WIN_RESTORE (recalibrate) cmd.
  */
-ide_startstop_t recal_intr (ide_drive_t *drive)
+static ide_startstop_t recal_intr(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = HWIF(drive);
        u8 stat;
diff --git a/include/linux/ide.h b/include/linux/ide.h
index 5d675f1..721c9d8 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -911,6 +911,7 @@ enum {
        IDE_TFLAG_WRITE                 = (1 << 15),
        IDE_TFLAG_FLAGGED_SET_IN_FLAGS  = (1 << 16),
        IDE_TFLAG_IN_DATA               = (1 << 17),
+       IDE_TFLAG_CUSTOM_HANDLER        = (1 << 18),
 };
 
 struct ide_taskfile {
@@ -949,7 +950,6 @@ typedef struct ide_task_s {
        };
        u32                     tf_flags;
        int                     data_phase;
-       ide_handler_t           *handler;
        struct request          *rq;            /* copy of request */
        void                    *special;       /* valid_t generally */
 } ide_task_t;
@@ -970,9 +970,6 @@ void ide_pktcmd_tf_load(ide_drive_t *, u32, u16, u8);
  */
 extern ide_startstop_t do_rw_taskfile(ide_drive_t *, ide_task_t *);
 
-extern ide_startstop_t set_multmode_intr(ide_drive_t *);
-extern ide_startstop_t set_geometry_intr(ide_drive_t *);
-extern ide_startstop_t recal_intr(ide_drive_t *);
 extern ide_startstop_t task_in_intr(ide_drive_t *);
 extern ide_startstop_t pre_task_out_intr(ide_drive_t *, struct request *);
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to