ide: drop dsc_handle argument from ide_pc_intr()

* Add 'int dsc' argument to ->pc_callback method.

* Call ide_tape_handle_dsc() internally in ide_tape_callback()
  if dsc argument is set and update ide_pc_intr() accordingly.

There should be no functional changes caused by this patch.

Cc: Borislav Petkov <petkovbb@gmail.com>
Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 9b5a18e1
...@@ -207,7 +207,7 @@ EXPORT_SYMBOL_GPL(ide_set_media_lock); ...@@ -207,7 +207,7 @@ EXPORT_SYMBOL_GPL(ide_set_media_lock);
ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry, ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry,
void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *), void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *),
void (*retry_pc)(ide_drive_t *), void (*dsc_handle)(ide_drive_t *), void (*retry_pc)(ide_drive_t *),
int (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned, int)) int (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned, int))
{ {
ide_hwif_t *hwif = drive->hwif; ide_hwif_t *hwif = drive->hwif;
...@@ -216,12 +216,12 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, ...@@ -216,12 +216,12 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
xfer_func_t *xferfunc; xfer_func_t *xferfunc;
unsigned int temp; unsigned int temp;
u16 bcount; u16 bcount;
u8 stat, ireason, scsi = drive->scsi; u8 stat, ireason, scsi = drive->scsi, dsc = 0;
debug_log("Enter %s - interrupt handler\n", __func__); debug_log("Enter %s - interrupt handler\n", __func__);
if (pc->flags & PC_FLAG_TIMEDOUT) { if (pc->flags & PC_FLAG_TIMEDOUT) {
drive->pc_callback(drive); drive->pc_callback(drive, 0);
return ide_stopped; return ide_stopped;
} }
...@@ -283,14 +283,12 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, ...@@ -283,14 +283,12 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
} }
cmd_finished: cmd_finished:
pc->error = 0; pc->error = 0;
if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) &&
(stat & ATA_DSC) == 0) { if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) && (stat & ATA_DSC) == 0)
dsc_handle(drive); dsc = 1;
return ide_stopped;
}
/* Command finished - Call the callback function */ /* Command finished - Call the callback function */
drive->pc_callback(drive); drive->pc_callback(drive, dsc);
return ide_stopped; return ide_stopped;
} }
......
...@@ -156,7 +156,7 @@ static void idefloppy_update_buffers(ide_drive_t *drive, ...@@ -156,7 +156,7 @@ static void idefloppy_update_buffers(ide_drive_t *drive,
idefloppy_end_request(drive, 1, 0); idefloppy_end_request(drive, 1, 0);
} }
static void ide_floppy_callback(ide_drive_t *drive) static void ide_floppy_callback(ide_drive_t *drive, int dsc)
{ {
idefloppy_floppy_t *floppy = drive->driver_data; idefloppy_floppy_t *floppy = drive->driver_data;
struct ide_atapi_pc *pc = floppy->pc; struct ide_atapi_pc *pc = floppy->pc;
...@@ -223,7 +223,7 @@ static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive) ...@@ -223,7 +223,7 @@ static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive)
return ide_pc_intr(drive, floppy->pc, idefloppy_pc_intr, return ide_pc_intr(drive, floppy->pc, idefloppy_pc_intr,
WAIT_FLOPPY_CMD, NULL, idefloppy_update_buffers, WAIT_FLOPPY_CMD, NULL, idefloppy_update_buffers,
idefloppy_retry_pc, NULL, ide_io_buffers); idefloppy_retry_pc, ide_io_buffers);
} }
/* /*
...@@ -308,7 +308,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, ...@@ -308,7 +308,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
pc->error = IDEFLOPPY_ERROR_GENERAL; pc->error = IDEFLOPPY_ERROR_GENERAL;
floppy->failed_pc = NULL; floppy->failed_pc = NULL;
drive->pc_callback(drive); drive->pc_callback(drive, 0);
return ide_stopped; return ide_stopped;
} }
......
...@@ -522,7 +522,9 @@ static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects) ...@@ -522,7 +522,9 @@ static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects)
return 0; return 0;
} }
static void ide_tape_callback(ide_drive_t *drive) static void ide_tape_handle_dsc(ide_drive_t *);
static void ide_tape_callback(ide_drive_t *drive, int dsc)
{ {
idetape_tape_t *tape = drive->driver_data; idetape_tape_t *tape = drive->driver_data;
struct ide_atapi_pc *pc = tape->pc; struct ide_atapi_pc *pc = tape->pc;
...@@ -530,6 +532,9 @@ static void ide_tape_callback(ide_drive_t *drive) ...@@ -530,6 +532,9 @@ static void ide_tape_callback(ide_drive_t *drive)
debug_log(DBG_PROCS, "Enter %s\n", __func__); debug_log(DBG_PROCS, "Enter %s\n", __func__);
if (dsc)
ide_tape_handle_dsc(drive);
if (tape->failed_pc == pc) if (tape->failed_pc == pc)
tape->failed_pc = NULL; tape->failed_pc = NULL;
...@@ -658,7 +663,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive) ...@@ -658,7 +663,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
return ide_pc_intr(drive, tape->pc, idetape_pc_intr, WAIT_TAPE_CMD, return ide_pc_intr(drive, tape->pc, idetape_pc_intr, WAIT_TAPE_CMD,
NULL, idetape_update_buffers, idetape_retry_pc, NULL, idetape_update_buffers, idetape_retry_pc,
ide_tape_handle_dsc, ide_tape_io_buffers); ide_tape_io_buffers);
} }
/* /*
...@@ -743,7 +748,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, ...@@ -743,7 +748,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
pc->error = IDETAPE_ERROR_GENERAL; pc->error = IDETAPE_ERROR_GENERAL;
} }
tape->failed_pc = NULL; tape->failed_pc = NULL;
drive->pc_callback(drive); drive->pc_callback(drive, 0);
return ide_stopped; return ide_stopped;
} }
debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]); debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]);
...@@ -805,7 +810,7 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) ...@@ -805,7 +810,7 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
pc->error = IDETAPE_ERROR_GENERAL; pc->error = IDETAPE_ERROR_GENERAL;
tape->failed_pc = NULL; tape->failed_pc = NULL;
} }
drive->pc_callback(drive); drive->pc_callback(drive, 0);
return ide_stopped; return ide_stopped;
} }
......
...@@ -137,7 +137,7 @@ static void ide_scsi_hex_dump(u8 *data, int len) ...@@ -137,7 +137,7 @@ static void ide_scsi_hex_dump(u8 *data, int len)
static int idescsi_end_request(ide_drive_t *, int, int); static int idescsi_end_request(ide_drive_t *, int, int);
static void ide_scsi_callback(ide_drive_t *drive) static void ide_scsi_callback(ide_drive_t *drive, int dsc)
{ {
idescsi_scsi_t *scsi = drive_to_idescsi(drive); idescsi_scsi_t *scsi = drive_to_idescsi(drive);
struct ide_atapi_pc *pc = scsi->pc; struct ide_atapi_pc *pc = scsi->pc;
...@@ -298,8 +298,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) ...@@ -298,8 +298,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
struct ide_atapi_pc *pc = scsi->pc; struct ide_atapi_pc *pc = scsi->pc;
return ide_pc_intr(drive, pc, idescsi_pc_intr, get_timeout(pc), return ide_pc_intr(drive, pc, idescsi_pc_intr, get_timeout(pc),
idescsi_expiry, NULL, NULL, NULL, idescsi_expiry, NULL, NULL, ide_io_buffers);
ide_io_buffers);
} }
static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive)
......
...@@ -485,7 +485,7 @@ struct ide_drive_s { ...@@ -485,7 +485,7 @@ struct ide_drive_s {
struct completion gendev_rel_comp; /* to deal with device release() */ struct completion gendev_rel_comp; /* to deal with device release() */
/* callback for packet commands */ /* callback for packet commands */
void (*pc_callback)(struct ide_drive_s *); void (*pc_callback)(struct ide_drive_s *, int);
unsigned long atapi_flags; unsigned long atapi_flags;
}; };
...@@ -1174,7 +1174,7 @@ int ide_set_media_lock(ide_drive_t *, struct gendisk *, int); ...@@ -1174,7 +1174,7 @@ int ide_set_media_lock(ide_drive_t *, struct gendisk *, int);
ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry, ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry,
void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *), void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *),
void (*retry_pc)(ide_drive_t *), void (*dsc_handle)(ide_drive_t *), void (*retry_pc)(ide_drive_t *),
int (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned int, int (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned int,
int)); int));
ide_startstop_t ide_transfer_pc(ide_drive_t *, struct ide_atapi_pc *, ide_startstop_t ide_transfer_pc(ide_drive_t *, struct ide_atapi_pc *,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment