ide-floppy: use ide_pio_bytes()
PATCH 2/2 ide-floppy: use ide_pio_bytes()
From: Bartlomiej Zolnierkiewicz <[email protected]>
Subject: [PATCH] ide-floppy: use ide_pio_bytes()
* Fix ide_init_sg_cmd() setup for non-fs requests.
* Convert ide_pc_intr() to use ide_pio_bytes() for floppy media.
* Remove no longer needed ide_io_buffers() and sg/sg_cnt fields from struct ide_atapi_pc.
Cc Borislav Petkov <[email protected]>
Signed-off-by Bartlomiej Zolnierkiewicz <[email protected]>
--- drivers/ide/ide-atapi.c | 57 +++++------------------------------------------ drivers/ide/ide-floppy.c | 9 ------- include/linux/ide.h | 5 ---- 3 files changed, 8 insertions(+), 63 deletions(-)
drivers/ide/ide-atapi.c +7 -50
@@ -69,49 +69,6 @@ int ide_check_atapi_device(ide_drive_t * }EXPORT_SYMBOL_GPL (ide_check_atapi_device); -/* PIO data transfer routine using the scatter gather table. */ -int ide_io_buffers (ide_drive_t *drive,struct ide_atapi_pc *pc, -unsigned int bcount,int write) -{ -ide_hwif_t *hwif = drive->hwif; -const struct ide_tp_ops *tp_ops = hwif->tp_ops; -xfer_func_t *xf = write ? tp_ops->output_data : tp_ops->input_data; -struct scatterlist *sg = pc->sg; -char *buf; -int count, done =0 ; - -while (bcount) { - count =min (sg->length - pc->b_count, bcount); - -if (PageHighMem (sg_page (sg))) { -unsigned long flags; - -local_irq_save (flags); - buf =kmap_atomic (sg_page (sg),KM_IRQ0 ) + sg->offset; -xf (drive,NULL , buf + pc->b_count, count); -kunmap_atomic (buf - sg->offset,KM_IRQ0 ); -local_irq_restore (flags); - }else { - buf =sg_virt (sg); -xf (drive,NULL , buf + pc->b_count, count); - } - - bcount -= count; - pc->b_count += count; - done += count; - -if (pc->b_count == sg->length) { -if (!--pc->sg_cnt) -break ; - pc->sg = sg =sg_next (sg); - pc->b_count =0 ; - } - } - -return done; -} -EXPORT_SYMBOL_GPL (ide_io_buffers); -void ide_init_pc (struct ide_atapi_pc *pc) {memset (pc,0 ,sizeof (*pc));
@@ -305,6 +262,7 @@ static ide_startstop_t ide_pc_intr(ide_d {struct ide_atapi_pc *pc = drive->pc;ide_hwif_t *hwif = drive->hwif; +struct ide_cmd *cmd = &hwif->cmd;struct request *rq = hwif->rq;const struct ide_tp_ops *tp_ops = hwif->tp_ops;xfer_func_t *xferfunc;
@@ -426,14 +384,13 @@ static ide_startstop_t ide_pc_intr(ide_d xferfunc = write ? tp_ops->output_data : tp_ops->input_data; -if ((drive->media == ide_floppy && !pc->buf) || - (drive->media == ide_tape && pc->bh)) { - done = drive->pc_io_buffers (drive, pc, bcount, write); - +if (drive->media == ide_floppy && pc->buf ==NULL ) { + done = min_t(unsigned int, bcount, cmd->nleft); +ide_pio_bytes (drive, cmd, write, done);/* FIXME: don't do partial completions */ -if (drive->media == ide_floppy) -ide_complete_rq (drive,0 , - done ? done :ide_rq_bytes (rq)); +ide_complete_rq (drive,0 , done ? done :ide_rq_bytes (rq)); + }else if (drive->media == ide_tape && pc->bh) { + done = drive->pc_io_buffers (drive, pc, bcount, write); }else { done = min_t(unsigned int, bcount, pc->req_xfer - pc->xferred);xferfunc (drive,NULL , pc->cur_pos, done);
drivers/ide/ide-floppy.c +1 -8
@@ -213,7 +213,6 @@ static void idefloppy_create_rw_cmd(ide_memcpy (rq->cmd, pc->c,12 ); pc->rq = rq; - pc->b_count =0 ;if (rq->cmd_flags &REQ_RW ) pc->flags |=PC_FLAG_WRITING ; pc->buf =NULL ;
@@ -227,7 +226,6 @@ static void idefloppy_blockpc_cmd(structide_init_pc (pc);memcpy (pc->c, rq->cmd,sizeof (pc->c)); pc->rq = rq; - pc->b_count =0 ;if (rq->data_len &&rq_data_dir (rq) ==WRITE ) pc->flags |=PC_FLAG_WRITING ; pc->buf = rq->data;
@@ -244,7 +242,6 @@ static ide_startstop_t ide_floppy_do_req struct request *rq, sector_t block) {struct ide_disk_obj *floppy = drive->driver_data; -ide_hwif_t *hwif = drive->hwif;struct ide_cmd cmd;struct ide_atapi_pc *pc;
@@ -293,12 +290,9 @@ static ide_startstop_t ide_floppy_do_req cmd.rq = rq; -ide_init_sg_cmd (&cmd, rq->nr_sectors <<9 ); +ide_init_sg_cmd (&cmd, pc->req_xfer);ide_map_sg (drive, &cmd); - pc->sg = hwif->sg_table; - pc->sg_cnt = cmd.sg_nents; - pc->rq = rq;return ide_floppy_issue_pc (drive, &cmd, pc);
@@ -484,7 +478,6 @@ static void ide_floppy_setup(ide_drive_t drive->pc_callback = ide_floppy_callback; drive->pc_update_buffers = idefloppy_update_buffers; - drive->pc_io_buffers = ide_io_buffers;/* * We used to check revisions here. At this point however I'm giving up.
include/linux/ide.h +0 -5
@@ -414,9 +414,6 @@ struct ide_atapi_pc {struct idetape_bh *bh;char *b_data; -struct scatterlist *sg; -unsigned int sg_cnt; -unsigned long timeout; };
@@ -1172,8 +1169,6 @@ void ide_tf_read(ide_drive_t *, struct ivoid ide_input_data (ide_drive_t *,struct ide_cmd *,void *,unsigned int );void ide_output_data (ide_drive_t *,struct ide_cmd *,void *,unsigned int ); -int ide_io_buffers (ide_drive_t *,struct ide_atapi_pc *,unsigned int ,int ); -extern void SELECT_DRIVE (ide_drive_t *);void SELECT_MASK (ide_drive_t *,int );