From: Bartlomiej Zolnierkiewicz - remove not needed !rq->bio code from ide_[un]map_buffer() (it is used only for fs requests which are always bio based) - update rq counters directly in task_buffer_sectors() - use task_buffer[_multi]_sectors() in taskfile PIO handlers (CONFIG_IDE_TASKFILE_IO=n and flagged ones) so: (a) rq->hard_cur_sectors is used for rq mapping (b) in case of error valid rq->sector is reported (c) we can s/rq->current_nr_sectors/rq->nr_sectors/ later - uninline task_buffer_sectors() - remove no longer needed task_rq_offset() Signed-off-by: Bartlomiej Zolnierkiewicz Signed-off-by: Andrew Morton --- 25-akpm/drivers/ide/ide-taskfile.c | 102 ++++++++----------------------------- 25-akpm/include/linux/ide.h | 20 ------- 2 files changed, 26 insertions(+), 96 deletions(-) diff -puN drivers/ide/ide-taskfile.c~ide-use-task_buffer_sectors-in-ide-taskfilec drivers/ide/ide-taskfile.c --- 25/drivers/ide/ide-taskfile.c~ide-use-task_buffer_sectors-in-ide-taskfilec 2004-06-20 13:57:32.308231176 -0700 +++ 25-akpm/drivers/ide/ide-taskfile.c 2004-06-20 13:57:32.316229960 -0700 @@ -288,12 +288,14 @@ ide_startstop_t task_no_data_intr (ide_d EXPORT_SYMBOL(task_no_data_intr); -static inline void task_buffer_sectors(ide_drive_t *drive, struct request *rq, - unsigned nsect, unsigned rw) +static void task_buffer_sectors(ide_drive_t *drive, struct request *rq, + unsigned nsect, unsigned rw) { char *buf = rq->buffer + blk_rq_offset(rq); - process_that_request_first(rq, nsect); + rq->sector += nsect; + rq->current_nr_sectors -= nsect; + rq->nr_sectors -= nsect; __task_sectors(drive, buf, nsect, rw); } @@ -321,7 +323,6 @@ ide_startstop_t task_in_intr (ide_drive_ { struct request *rq = HWGROUP(drive)->rq; ide_hwif_t *hwif = HWIF(drive); - char *pBuf = NULL; u8 stat; if (!OK_STAT(stat = hwif->INB(IDE_STATUS_REG),DATA_READY,BAD_R_STAT)) { @@ -334,11 +335,10 @@ ide_startstop_t task_in_intr (ide_drive_ } } - pBuf = rq->buffer + task_rq_offset(rq); - taskfile_input_data(drive, pBuf, SECTOR_WORDS); + task_buffer_sectors(drive, rq, 1, IDE_PIO_IN); /* FIXME: check drive status */ - if (--rq->current_nr_sectors <= 0) + if (!rq->current_nr_sectors) if (!DRIVER(drive)->end_request(drive, 1, 0)) return ide_stopped; ide_set_handler(drive, &task_in_intr, WAIT_WORSTCASE, NULL); @@ -354,9 +354,6 @@ ide_startstop_t task_mulin_intr (ide_dri { ide_hwif_t *hwif = HWIF(drive); struct request *rq = HWGROUP(drive)->rq; - char *pBuf = NULL; - unsigned int msect = drive->mult_count; - unsigned int nsect; u8 stat; if (!OK_STAT(stat = hwif->INB(IDE_STATUS_REG),DATA_READY,BAD_R_STAT)) { @@ -368,21 +365,14 @@ ide_startstop_t task_mulin_intr (ide_dri return ide_started; } - do { - nsect = rq->current_nr_sectors; - if (nsect > msect) - nsect = msect; - pBuf = rq->buffer + task_rq_offset(rq); - taskfile_input_data(drive, pBuf, nsect * SECTOR_WORDS); - rq->current_nr_sectors -= nsect; - msect -= nsect; + task_buffer_multi_sectors(drive, rq, IDE_PIO_IN); + + /* FIXME: check drive status */ + if (!rq->current_nr_sectors) { + DRIVER(drive)->end_request(drive, 1, 0); + return ide_stopped; + } - /* FIXME: check drive status */ - if (!rq->current_nr_sectors) { - if (!DRIVER(drive)->end_request(drive, 1, 0)) - return ide_stopped; - } - } while (msect); ide_set_handler(drive, &task_mulin_intr, WAIT_WORSTCASE, NULL); return ide_started; } @@ -405,8 +395,7 @@ ide_startstop_t pre_task_out_intr (ide_d return startstop; } /* For Write_sectors we need to stuff the first sector */ - taskfile_output_data(drive, rq->buffer + task_rq_offset(rq), SECTOR_WORDS); - rq->current_nr_sectors--; + task_buffer_sectors(drive, rq, 1, IDE_PIO_OUT); return ide_started; } @@ -421,7 +410,6 @@ ide_startstop_t task_out_intr (ide_drive { ide_hwif_t *hwif = HWIF(drive); struct request *rq = HWGROUP(drive)->rq; - char *pBuf = NULL; u8 stat; if (!OK_STAT(stat = hwif->INB(IDE_STATUS_REG), DRIVE_READY, drive->bad_wstat)) { @@ -435,10 +423,7 @@ ide_startstop_t task_out_intr (ide_drive if (!DRIVER(drive)->end_request(drive, 1, 0)) return ide_stopped; if ((rq->current_nr_sectors==1) ^ (stat & DRQ_STAT)) { - rq = HWGROUP(drive)->rq; - pBuf = rq->buffer + task_rq_offset(rq); - taskfile_output_data(drive, pBuf, SECTOR_WORDS); - rq->current_nr_sectors--; + task_buffer_sectors(drive, rq, 1, IDE_PIO_OUT); } ide_set_handler(drive, &task_out_intr, WAIT_WORSTCASE, NULL); return ide_started; @@ -485,9 +470,6 @@ ide_startstop_t task_mulout_intr (ide_dr ide_hwif_t *hwif = HWIF(drive); u8 stat = hwif->INB(IDE_STATUS_REG); struct request *rq = HWGROUP(drive)->rq; - char *pBuf = NULL; - unsigned int msect = drive->mult_count; - unsigned int nsect; if (!OK_STAT(stat, DATA_READY, BAD_R_STAT) || !rq->current_nr_sectors) { if (stat & (ERR_STAT|DRQ_STAT)) { @@ -512,15 +494,7 @@ ide_startstop_t task_mulout_intr (ide_dr spin_unlock_irqrestore(&ide_lock, lflags); } - do { - nsect = rq->current_nr_sectors; - if (nsect > msect) - nsect = msect; - pBuf = rq->buffer + task_rq_offset(rq); - msect -= nsect; - taskfile_output_data(drive, pBuf, nsect * SECTOR_WORDS); - rq->current_nr_sectors -= nsect; - } while (msect); + task_buffer_multi_sectors(drive, rq, IDE_PIO_OUT); if (HWGROUP(drive)->handler == NULL) ide_set_handler(drive, &task_mulout_intr, WAIT_WORSTCASE, NULL); return ide_started; @@ -1327,7 +1301,6 @@ ide_startstop_t flagged_task_in_intr (id ide_hwif_t *hwif = HWIF(drive); u8 stat = hwif->INB(IDE_STATUS_REG); struct request *rq = HWGROUP(drive)->rq; - char *pBuf = NULL; int retries = 5; if (!OK_STAT(stat, DATA_READY, BAD_R_STAT)) { @@ -1343,10 +1316,9 @@ ide_startstop_t flagged_task_in_intr (id return DRIVER(drive)->error(drive, "flagged_task_in_intr (unexpected data phase)", stat); } - pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE); - taskfile_input_data(drive, pBuf, SECTOR_WORDS); + task_buffer_sectors(drive, rq, 1, IDE_PIO_IN); - if (--rq->current_nr_sectors != 0) { + if (rq->current_nr_sectors) { /* * (ks) We don't know which command was executed. * So, we wait the 'WORSTCASE' value. @@ -1370,11 +1342,7 @@ ide_startstop_t flagged_task_mulin_intr ide_hwif_t *hwif = HWIF(drive); u8 stat = hwif->INB(IDE_STATUS_REG); struct request *rq = HWGROUP(drive)->rq; - char *pBuf = NULL; int retries = 5; - unsigned int msect, nsect; - - msect = drive->mult_count; if (!OK_STAT(stat, DATA_READY, BAD_R_STAT)) { if (stat & ERR_STAT) { @@ -1389,11 +1357,8 @@ ide_startstop_t flagged_task_mulin_intr return DRIVER(drive)->error(drive, "flagged_task_mulin_intr (unexpected data phase)", stat); } - nsect = (rq->current_nr_sectors > msect) ? msect : rq->current_nr_sectors; - pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE); - taskfile_input_data(drive, pBuf, nsect * SECTOR_WORDS); + task_buffer_multi_sectors(drive, rq, IDE_PIO_IN); - rq->current_nr_sectors -= nsect; if (rq->current_nr_sectors != 0) { /* * (ks) We don't know which command was executed. @@ -1427,8 +1392,7 @@ ide_startstop_t flagged_pre_task_out_int return startstop; } - taskfile_output_data(drive, rq->buffer, SECTOR_WORDS); - --rq->current_nr_sectors; + task_buffer_sectors(drive, rq, 1, IDE_PIO_OUT); return ide_started; } @@ -1438,7 +1402,6 @@ ide_startstop_t flagged_task_out_intr (i ide_hwif_t *hwif = HWIF(drive); u8 stat = hwif->INB(IDE_STATUS_REG); struct request *rq = HWGROUP(drive)->rq; - char *pBuf = NULL; if (!OK_STAT(stat, DRIVE_READY, BAD_W_STAT)) return DRIVER(drive)->error(drive, "flagged_task_out_intr", stat); @@ -1458,9 +1421,7 @@ ide_startstop_t flagged_task_out_intr (i return DRIVER(drive)->error(drive, "flagged_task_out_intr (unexpected data phase)", stat); } - pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE); - taskfile_output_data(drive, pBuf, SECTOR_WORDS); - --rq->current_nr_sectors; + task_buffer_sectors(drive, rq, 1, IDE_PIO_OUT); /* * (ks) We don't know which command was executed. @@ -1473,11 +1434,7 @@ ide_startstop_t flagged_task_out_intr (i ide_startstop_t flagged_pre_task_mulout_intr (ide_drive_t *drive, struct request *rq) { - char *pBuf = NULL; ide_startstop_t startstop; - unsigned int msect, nsect; - - msect = drive->mult_count; if (ide_wait_stat(&startstop, drive, DATA_READY, BAD_W_STAT, WAIT_DRQ)) { @@ -1485,11 +1442,7 @@ ide_startstop_t flagged_pre_task_mulout_ return startstop; } - nsect = (rq->current_nr_sectors > msect) ? msect : rq->current_nr_sectors; - pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE); - taskfile_output_data(drive, pBuf, nsect * SECTOR_WORDS); - - rq->current_nr_sectors -= nsect; + task_buffer_multi_sectors(drive, rq, IDE_PIO_OUT); return ide_started; } @@ -1499,10 +1452,6 @@ ide_startstop_t flagged_task_mulout_intr ide_hwif_t *hwif = HWIF(drive); u8 stat = hwif->INB(IDE_STATUS_REG); struct request *rq = HWGROUP(drive)->rq; - char *pBuf = NULL; - unsigned int msect, nsect; - - msect = drive->mult_count; if (!OK_STAT(stat, DRIVE_READY, BAD_W_STAT)) return DRIVER(drive)->error(drive, "flagged_task_mulout_intr", stat); @@ -1522,10 +1471,7 @@ ide_startstop_t flagged_task_mulout_intr return DRIVER(drive)->error(drive, "flagged_task_mulout_intr (unexpected data phase)", stat); } - nsect = (rq->current_nr_sectors > msect) ? msect : rq->current_nr_sectors; - pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE); - taskfile_output_data(drive, pBuf, nsect * SECTOR_WORDS); - rq->current_nr_sectors -= nsect; + task_buffer_multi_sectors(drive, rq, IDE_PIO_OUT); /* * (ks) We don't know which command was executed. diff -puN include/linux/ide.h~ide-use-task_buffer_sectors-in-ide-taskfilec include/linux/ide.h --- 25/include/linux/ide.h~ide-use-task_buffer_sectors-in-ide-taskfilec 2004-06-20 13:57:32.310230872 -0700 +++ 25-akpm/include/linux/ide.h 2004-06-20 13:57:32.317229808 -0700 @@ -834,30 +834,14 @@ typedef struct ide_dma_ops_s { #define ide_rq_offset(rq) \ (((rq)->hard_cur_sectors - (rq)->current_nr_sectors) << 9) -/* - * taskfiles really should use hard_cur_sectors as well! - */ -#define task_rq_offset(rq) \ - (((rq)->nr_sectors - (rq)->current_nr_sectors) * SECTOR_SIZE) - static inline void *ide_map_buffer(struct request *rq, unsigned long *flags) { - /* - * fs request - */ - if (rq->bio) - return bio_kmap_irq(rq->bio, flags) + ide_rq_offset(rq); - - /* - * task request - */ - return rq->buffer + task_rq_offset(rq); + return bio_kmap_irq(rq->bio, flags) + ide_rq_offset(rq); } static inline void ide_unmap_buffer(struct request *rq, char *buffer, unsigned long *flags) { - if (rq->bio) - bio_kunmap_irq(buffer, flags); + bio_kunmap_irq(buffer, flags); } #endif /* !CONFIG_IDE_TASKFILE_IO */ _