Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 114165
b: refs/heads/master
c: 844b946
h: refs/heads/master
i:
  114163: cd62801
v: v3
  • Loading branch information
Bartlomiej Zolnierkiewicz committed Oct 13, 2008
1 parent 27f5cee commit ba11052
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2b9efba48283f34083df6bc53f6752fba4e4d409
refs/heads/master: 844b9468523c8c2c45b90df4efcabcbe4926b5ab
34 changes: 27 additions & 7 deletions trunk/drivers/ide/ide-atapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,9 +203,21 @@ int ide_set_media_lock(ide_drive_t *drive, struct gendisk *disk, int on)
}
EXPORT_SYMBOL_GPL(ide_set_media_lock);

int ide_scsi_expiry(ide_drive_t *drive)
{
struct ide_atapi_pc *pc = drive->pc;

debug_log("%s called for %lu at %lu\n", __func__,
pc->scsi_cmd->serial_number, jiffies);

pc->flags |= PC_FLAG_TIMEDOUT;

return 0; /* we do not want the IDE subsystem to retry */
}
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, unsigned int timeout, ide_expiry_t *expiry,
ide_startstop_t ide_pc_intr(ide_drive_t *drive, ide_handler_t *handler,
void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *),
void (*retry_pc)(ide_drive_t *),
int (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned, int))
Expand All @@ -215,12 +227,22 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive,
struct request *rq = hwif->hwgroup->rq;
const struct ide_tp_ops *tp_ops = hwif->tp_ops;
xfer_func_t *xferfunc;
unsigned int temp;
ide_expiry_t *expiry;
unsigned int timeout, temp;
u16 bcount;
u8 stat, ireason, scsi = drive->scsi, dsc = 0;

debug_log("Enter %s - interrupt handler\n", __func__);

if (scsi) {
timeout = ide_scsi_get_timeout(pc);
expiry = ide_scsi_expiry;
} else {
timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
: WAIT_TAPE_CMD;
expiry = NULL;
}

if (pc->flags & PC_FLAG_TIMEDOUT) {
drive->pc_callback(drive, 0);
return ide_stopped;
Expand Down Expand Up @@ -347,9 +369,7 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive,
pc->xferred += temp;
pc->cur_pos += temp;
ide_pad_transfer(drive, 0, bcount - temp);
ide_set_handler(drive, handler, timeout,
expiry);
return ide_started;
goto next_irq;
}
debug_log("The device wants to send us more data than "
"expected - allowing transfer\n");
Expand All @@ -376,7 +396,7 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive,

debug_log("[cmd %x] transferred %d bytes on that intr.\n",
rq->cmd[0], bcount);

next_irq:
/* And set the interrupt handler again */
ide_set_handler(drive, handler, timeout, expiry);
return ide_started;
Expand Down
3 changes: 1 addition & 2 deletions trunk/drivers/ide/ide-floppy.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,7 @@ static void idefloppy_retry_pc(ide_drive_t *drive)
/* 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,
WAIT_FLOPPY_CMD, NULL, idefloppy_update_buffers,
return ide_pc_intr(drive, idefloppy_pc_intr, idefloppy_update_buffers,
idefloppy_retry_pc, ide_io_buffers);
}

Expand Down
5 changes: 2 additions & 3 deletions trunk/drivers/ide/ide-tape.c
Original file line number Diff line number Diff line change
Expand Up @@ -655,9 +655,8 @@ static int ide_tape_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
*/
static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
{
return ide_pc_intr(drive, idetape_pc_intr, WAIT_TAPE_CMD,
NULL, idetape_update_buffers, idetape_retry_pc,
ide_tape_io_buffers);
return ide_pc_intr(drive, idetape_pc_intr, idetape_update_buffers,
idetape_retry_pc, ide_tape_io_buffers);
}

/*
Expand Down
25 changes: 4 additions & 21 deletions trunk/drivers/scsi/ide-scsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,36 +270,19 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs)
return 0;
}

static inline unsigned long get_timeout(struct ide_atapi_pc *pc)
{
return max_t(unsigned long, WAIT_CMD, pc->timeout - jiffies);
}

static int idescsi_expiry(ide_drive_t *drive)
{
struct ide_atapi_pc *pc = drive->pc;

debug_log("%s called for %lu at %lu\n", __func__,
pc->scsi_cmd->serial_number, jiffies);

pc->flags |= PC_FLAG_TIMEDOUT;

return 0; /* we do not want the ide subsystem to retry */
}

/*
* Our interrupt handler.
*/
static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
{
return ide_pc_intr(drive, idescsi_pc_intr, get_timeout(drive->pc),
idescsi_expiry, NULL, NULL, ide_io_buffers);
return ide_pc_intr(drive, idescsi_pc_intr, NULL, NULL, ide_io_buffers);
}

static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive)
{
return ide_transfer_pc(drive, idescsi_pc_intr,
get_timeout(drive->pc), idescsi_expiry);
ide_scsi_get_timeout(drive->pc),
ide_scsi_expiry);
}

static inline int idescsi_set_direction(struct ide_atapi_pc *pc)
Expand Down Expand Up @@ -348,7 +331,7 @@ static ide_startstop_t idescsi_issue_pc(ide_drive_t *drive,
drive->pc = pc;

return ide_issue_pc(drive, idescsi_transfer_pc,
get_timeout(pc), idescsi_expiry);
ide_scsi_get_timeout(pc), ide_scsi_expiry);
}

/*
Expand Down
10 changes: 8 additions & 2 deletions trunk/include/linux/ide.h
Original file line number Diff line number Diff line change
Expand Up @@ -1175,8 +1175,14 @@ int ide_do_test_unit_ready(ide_drive_t *, struct gendisk *);
int ide_do_start_stop(ide_drive_t *, struct gendisk *, int);
int ide_set_media_lock(ide_drive_t *, struct gendisk *, int);

ide_startstop_t ide_pc_intr(ide_drive_t *drive,
ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry,
static inline unsigned long ide_scsi_get_timeout(struct ide_atapi_pc *pc)
{
return max_t(unsigned long, WAIT_CMD, pc->timeout - jiffies);
}

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 *),
void (*retry_pc)(ide_drive_t *),
int (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned int,
Expand Down

0 comments on commit ba11052

Please sign in to comment.