From: Bartlomiej Zolnierkiewicz - setup hwgroup->handler/timer in ->prehandler() (after checking drive status) and in do_rw_taskfile() only send a command - make pre_task_mulout_intr() transfer first datablock itself instead of calling ->handler() so we don't have to play tricks with hwgroup->handler/timer in task_mulout_intr() Signed-off-by: Bartlomiej Zolnierkiewicz Signed-off-by: Andrew Morton --- 25-akpm/drivers/ide/ide-taskfile.c | 39 +++++++++---------------------------- 1 files changed, 10 insertions(+), 29 deletions(-) diff -puN drivers/ide/ide-taskfile.c~ide-pio-out-setup-fixes-config_ide_taskfile_io=n drivers/ide/ide-taskfile.c --- 25/drivers/ide/ide-taskfile.c~ide-pio-out-setup-fixes-config_ide_taskfile_io=n 2004-06-20 13:57:33.443058656 -0700 +++ 25-akpm/drivers/ide/ide-taskfile.c 2004-06-20 13:57:33.449057744 -0700 @@ -159,7 +159,7 @@ ide_startstop_t do_rw_taskfile (ide_driv hwif->OUTB(taskfile->high_cylinder, IDE_HCYL_REG); hwif->OUTB((taskfile->device_head & HIHI) | drive->select.all, IDE_SELECT_REG); -#ifdef CONFIG_IDE_TASKFILE_IO + if (task->handler != NULL) { if (task->prehandler != NULL) { hwif->OUTBSYNC(drive, taskfile->command, IDE_COMMAND_REG); @@ -169,14 +169,6 @@ ide_startstop_t do_rw_taskfile (ide_driv ide_execute_command(drive, taskfile->command, task->handler, WAIT_WORSTCASE, NULL); return ide_started; } -#else - if (task->handler != NULL) { - ide_execute_command(drive, taskfile->command, task->handler, WAIT_WORSTCASE, NULL); - if (task->prehandler != NULL) - return task->prehandler(drive, task->rq); - return ide_started; - } -#endif if (!drive->using_dma) return ide_stopped; @@ -395,7 +387,9 @@ ide_startstop_t pre_task_out_intr (ide_d return startstop; } /* For Write_sectors we need to stuff the first sector */ + ide_set_handler(drive, &task_out_intr, WAIT_WORSTCASE, NULL); task_buffer_sectors(drive, rq, 1, IDE_PIO_OUT); + return ide_started; } @@ -433,7 +427,6 @@ EXPORT_SYMBOL(task_out_intr); ide_startstop_t pre_task_mulout_intr (ide_drive_t *drive, struct request *rq) { - ide_task_t *args = rq->special; ide_startstop_t startstop; if (ide_wait_stat(&startstop, drive, DATA_READY, @@ -451,19 +444,16 @@ ide_startstop_t pre_task_mulout_intr (id } } - /* - * WARNING :: if the drive as not acked good status we may not - * move the DATA-TRANSFER T-Bar as BSY != 0. - */ - return args->handler(drive); + ide_set_handler(drive, &task_mulout_intr, WAIT_WORSTCASE, NULL); + task_buffer_multi_sectors(drive, rq, IDE_PIO_OUT); + + return ide_started; } EXPORT_SYMBOL(pre_task_mulout_intr); /* * Handler for command write multiple - * Called directly from execute_drive_cmd for the first bunch of sectors, - * afterwards only by the ISR */ ide_startstop_t task_mulout_intr (ide_drive_t *drive) { @@ -481,22 +471,13 @@ ide_startstop_t task_mulout_intr (ide_dr return ide_stopped; } /* no data yet, so wait for another interrupt */ - if (HWGROUP(drive)->handler == NULL) - ide_set_handler(drive, &task_mulout_intr, WAIT_WORSTCASE, NULL); + ide_set_handler(drive, &task_mulout_intr, WAIT_WORSTCASE, NULL); return ide_started; } - if (HWGROUP(drive)->handler != NULL) { - unsigned long lflags; - spin_lock_irqsave(&ide_lock, lflags); - HWGROUP(drive)->handler = NULL; - del_timer(&HWGROUP(drive)->timer); - spin_unlock_irqrestore(&ide_lock, lflags); - } - task_buffer_multi_sectors(drive, rq, IDE_PIO_OUT); - if (HWGROUP(drive)->handler == NULL) - ide_set_handler(drive, &task_mulout_intr, WAIT_WORSTCASE, NULL); + ide_set_handler(drive, &task_mulout_intr, WAIT_WORSTCASE, NULL); + return ide_started; } _