}
 EXPORT_SYMBOL_GPL(ide_scsi_expiry);
 
-/* TODO: unify the code thus making some arguments go away */
-ide_startstop_t ide_pc_intr(ide_drive_t *drive, ide_handler_t *handler,
-       void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *),
-       int (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned, int))
+ide_startstop_t ide_pc_intr(ide_drive_t *drive, ide_handler_t *handler)
 {
        struct ide_atapi_pc *pc = drive->pc;
        ide_hwif_t *hwif = drive->hwif;
                        pc->flags |= PC_FLAG_DMA_ERROR;
                } else {
                        pc->xferred = pc->req_xfer;
-                       if (update_buffers)
-                               update_buffers(drive, pc);
+                       if (drive->pc_update_buffers)
+                               drive->pc_update_buffers(drive, pc);
                }
                debug_log("%s: DMA finished\n", drive->name);
        }
                                        temp = 0;
                                if (temp) {
                                        if (pc->sg)
-                                               io_buffers(drive, pc, temp, 0);
+                                               drive->pc_io_buffers(drive, pc,
+                                                                    temp, 0);
                                        else
                                                tp_ops->input_data(drive, NULL,
                                                        pc->cur_pos, temp);
        if ((drive->media == ide_floppy && !scsi && !pc->buf) ||
            (drive->media == ide_tape && !scsi && pc->bh) ||
            (scsi && pc->sg)) {
-               int done = io_buffers(drive, pc, bcount,
+               int done = drive->pc_io_buffers(drive, pc, bcount,
                                  !!(pc->flags & PC_FLAG_WRITING));
 
                /* FIXME: don't do partial completions */
 
 /* The usual interrupt handler called during a packet command. */
 static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive)
 {
-       return ide_pc_intr(drive, idefloppy_pc_intr, idefloppy_update_buffers,
-                          ide_io_buffers);
+       return ide_pc_intr(drive, idefloppy_pc_intr);
 }
 
 /*
 
        *((u16 *)&gcw) = id[ATA_ID_CONFIG];
 
-       drive->pc_callback = ide_floppy_callback;
+       drive->pc_callback       = ide_floppy_callback;
+       drive->pc_update_buffers = idefloppy_update_buffers;
+       drive->pc_io_buffers     = ide_io_buffers;
 
        if (((gcw[0] & 0x60) >> 5) == 1)
                drive->atapi_flags |= IDE_AFLAG_DRQ_INTERRUPT;
 
  */
 static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
 {
-       return ide_pc_intr(drive, idetape_pc_intr, idetape_update_buffers,
-                          ide_tape_io_buffers);
+       return ide_pc_intr(drive, idetape_pc_intr);
 }
 
 /*
        u8 gcw[2];
        u16 *ctl = (u16 *)&tape->caps[12];
 
-       drive->pc_callback = ide_tape_callback;
+       drive->pc_callback       = ide_tape_callback;
+       drive->pc_update_buffers = idetape_update_buffers;
+       drive->pc_io_buffers     = ide_tape_io_buffers;
 
        spin_lock_init(&tape->lock);
        drive->dsc_overlap = 1;
 
  */
 static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
 {
-       return ide_pc_intr(drive, idescsi_pc_intr, NULL, ide_io_buffers);
+       return ide_pc_intr(drive, idescsi_pc_intr);
 }
 
 static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive)
        set_bit(IDESCSI_LOG_CMD, &scsi->log);
 #endif /* IDESCSI_DEBUG_LOG */
 
-       drive->pc_callback = ide_scsi_callback;
+       drive->pc_callback       = ide_scsi_callback;
+       drive->pc_update_buffers = NULL;
+       drive->pc_io_buffers     = ide_io_buffers;
 
        ide_proc_register_driver(drive, scsi->driver);
 }
 
        /* callback for packet commands */
        void (*pc_callback)(struct ide_drive_s *, int);
 
+       void (*pc_update_buffers)(struct ide_drive_s *, struct ide_atapi_pc *);
+       int  (*pc_io_buffers)(struct ide_drive_s *, struct ide_atapi_pc *,
+                             unsigned int, int);
+
        unsigned long atapi_flags;
 
        struct ide_atapi_pc request_sense_pc;
 
 int ide_scsi_expiry(ide_drive_t *);
 
-ide_startstop_t ide_pc_intr(ide_drive_t *drive, ide_handler_t *handler,
-       void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *),
-       int (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned int,
-                          int));
+ide_startstop_t ide_pc_intr(ide_drive_t *drive, ide_handler_t *handler);
 ide_startstop_t ide_transfer_pc(ide_drive_t *,
                                ide_handler_t *, unsigned int, ide_expiry_t *);
 ide_startstop_t ide_issue_pc(ide_drive_t *,