ide-tape: simplify code branching in the interrupt handler
... by adding a new typedef function pointer idetape_io_buf in order to call the proper buffer i/o handler depending on the data direction. Bart: - move idetape_io_buf before idetape_pc_intr() comment Signed-off-by: Borislav Petkov <petkovbb@gmail.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
37016bab60
commit
a1efc85f0b
@ -1104,19 +1104,22 @@ static void idetape_postpone_request (ide_drive_t *drive)
|
|||||||
ide_stall_queue(drive, tape->dsc_polling_frequency);
|
ide_stall_queue(drive, tape->dsc_polling_frequency);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef void idetape_io_buf(ide_drive_t *, idetape_pc_t *, unsigned int);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* idetape_pc_intr is the usual interrupt handler which will be called
|
* This is the usual interrupt handler which will be called during a packet
|
||||||
* during a packet command. We will transfer some of the data (as
|
* command. We will transfer some of the data (as requested by the drive) and
|
||||||
* requested by the drive) and will re-point interrupt handler to us.
|
* will re-point interrupt handler to us. When data transfer is finished, we
|
||||||
* When data transfer is finished, we will act according to the
|
* will act according to the algorithm described before
|
||||||
* algorithm described before idetape_issue_packet_command.
|
* idetape_issue_packet_command.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
static ide_startstop_t idetape_pc_intr (ide_drive_t *drive)
|
static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
|
||||||
{
|
{
|
||||||
ide_hwif_t *hwif = drive->hwif;
|
ide_hwif_t *hwif = drive->hwif;
|
||||||
idetape_tape_t *tape = drive->driver_data;
|
idetape_tape_t *tape = drive->driver_data;
|
||||||
idetape_pc_t *pc = tape->pc;
|
idetape_pc_t *pc = tape->pc;
|
||||||
|
xfer_func_t *xferfunc;
|
||||||
|
idetape_io_buf *iobuf;
|
||||||
unsigned int temp;
|
unsigned int temp;
|
||||||
#if SIMULATE_ERRORS
|
#if SIMULATE_ERRORS
|
||||||
static int error_sim_count = 0;
|
static int error_sim_count = 0;
|
||||||
@ -1184,7 +1187,8 @@ static ide_startstop_t idetape_pc_intr (ide_drive_t *drive)
|
|||||||
debug_log(DBG_ERR, "%s: I/O error\n", tape->name);
|
debug_log(DBG_ERR, "%s: I/O error\n", tape->name);
|
||||||
|
|
||||||
if (pc->c[0] == REQUEST_SENSE) {
|
if (pc->c[0] == REQUEST_SENSE) {
|
||||||
printk(KERN_ERR "ide-tape: I/O error in request sense command\n");
|
printk(KERN_ERR "ide-tape: I/O error in request"
|
||||||
|
" sense command\n");
|
||||||
return ide_do_reset(drive);
|
return ide_do_reset(drive);
|
||||||
}
|
}
|
||||||
debug_log(DBG_ERR, "[cmd %x]: check condition\n",
|
debug_log(DBG_ERR, "[cmd %x]: check condition\n",
|
||||||
@ -1223,7 +1227,7 @@ static ide_startstop_t idetape_pc_intr (ide_drive_t *drive)
|
|||||||
ireason = hwif->INB(IDE_IREASON_REG);
|
ireason = hwif->INB(IDE_IREASON_REG);
|
||||||
|
|
||||||
if (ireason & CD) {
|
if (ireason & CD) {
|
||||||
printk(KERN_ERR "ide-tape: CoD != 0 in idetape_pc_intr\n");
|
printk(KERN_ERR "ide-tape: CoD != 0 in %s\n", __func__);
|
||||||
return ide_do_reset(drive);
|
return ide_do_reset(drive);
|
||||||
}
|
}
|
||||||
if (((ireason & IO) == IO) == test_bit(PC_WRITING, &pc->flags)) {
|
if (((ireason & IO) == IO) == test_bit(PC_WRITING, &pc->flags)) {
|
||||||
@ -1239,31 +1243,29 @@ static ide_startstop_t idetape_pc_intr (ide_drive_t *drive)
|
|||||||
temp = pc->actually_transferred + bcount;
|
temp = pc->actually_transferred + bcount;
|
||||||
if (temp > pc->request_transfer) {
|
if (temp > pc->request_transfer) {
|
||||||
if (temp > pc->buffer_size) {
|
if (temp > pc->buffer_size) {
|
||||||
printk(KERN_ERR "ide-tape: The tape wants to send us more data than expected - discarding data\n");
|
printk(KERN_ERR "ide-tape: The tape wants to "
|
||||||
|
"send us more data than expected "
|
||||||
|
"- discarding data\n");
|
||||||
idetape_discard_data(drive, bcount);
|
idetape_discard_data(drive, bcount);
|
||||||
ide_set_handler(drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL);
|
ide_set_handler(drive, &idetape_pc_intr,
|
||||||
|
IDETAPE_WAIT_CMD, NULL);
|
||||||
return ide_started;
|
return ide_started;
|
||||||
}
|
}
|
||||||
debug_log(DBG_SENSE, "The tape wants to send us more "
|
debug_log(DBG_SENSE, "The tape wants to send us more "
|
||||||
"data than expected - allowing transfer\n");
|
"data than expected - allowing transfer\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
iobuf = &idetape_input_buffers;
|
||||||
if (test_bit(PC_WRITING, &pc->flags)) {
|
xferfunc = hwif->atapi_input_bytes;
|
||||||
if (pc->bh != NULL)
|
|
||||||
idetape_output_buffers(drive, pc, bcount);
|
|
||||||
else
|
|
||||||
/* Write the current buffer */
|
|
||||||
hwif->atapi_output_bytes(drive, pc->current_position,
|
|
||||||
bcount);
|
|
||||||
} else {
|
} else {
|
||||||
if (pc->bh != NULL)
|
iobuf = &idetape_output_buffers;
|
||||||
idetape_input_buffers(drive, pc, bcount);
|
xferfunc = hwif->atapi_output_bytes;
|
||||||
else
|
|
||||||
/* Read the current buffer */
|
|
||||||
hwif->atapi_input_bytes(drive, pc->current_position,
|
|
||||||
bcount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pc->bh)
|
||||||
|
iobuf(drive, pc, bcount);
|
||||||
|
else
|
||||||
|
xferfunc(drive, pc->current_position, bcount);
|
||||||
|
|
||||||
/* Update the current position */
|
/* Update the current position */
|
||||||
pc->actually_transferred += bcount;
|
pc->actually_transferred += bcount;
|
||||||
pc->current_position += bcount;
|
pc->current_position += bcount;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user