ide: add pointer to the current packet command to ide_drive_t

* Add pointer to the current packet command (struct ide_atapi_pc *pc)
  to ide_drive_t and use it instead of the pointer in struct ide_*_obj.

* Use drive->pc in ide_{issue,transfer}_pc() and ide_pc_intr()
  instead of 'pc' argument.

There should be no functional changes caused by this patch.

Cc: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent b14c7212
...@@ -204,12 +204,13 @@ int ide_set_media_lock(ide_drive_t *drive, struct gendisk *disk, int on) ...@@ -204,12 +204,13 @@ int ide_set_media_lock(ide_drive_t *drive, struct gendisk *disk, int on)
EXPORT_SYMBOL_GPL(ide_set_media_lock); EXPORT_SYMBOL_GPL(ide_set_media_lock);
/* TODO: unify the code thus making some arguments go away */ /* TODO: unify the code thus making some arguments go away */
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,
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 (*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))
{ {
struct ide_atapi_pc *pc = drive->pc;
ide_hwif_t *hwif = drive->hwif; ide_hwif_t *hwif = drive->hwif;
struct request *rq = hwif->hwgroup->rq; struct request *rq = hwif->hwgroup->rq;
const struct ide_tp_ops *tp_ops = hwif->tp_ops; const struct ide_tp_ops *tp_ops = hwif->tp_ops;
...@@ -416,10 +417,11 @@ static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason) ...@@ -416,10 +417,11 @@ static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason)
return ireason; return ireason;
} }
ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc, ide_startstop_t ide_transfer_pc(ide_drive_t *drive,
ide_handler_t *handler, unsigned int timeout, ide_handler_t *handler, unsigned int timeout,
ide_expiry_t *expiry) ide_expiry_t *expiry)
{ {
struct ide_atapi_pc *pc = drive->pc;
ide_hwif_t *hwif = drive->hwif; ide_hwif_t *hwif = drive->hwif;
struct request *rq = hwif->hwgroup->rq; struct request *rq = hwif->hwgroup->rq;
ide_startstop_t startstop; ide_startstop_t startstop;
...@@ -458,10 +460,11 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc, ...@@ -458,10 +460,11 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc,
} }
EXPORT_SYMBOL_GPL(ide_transfer_pc); EXPORT_SYMBOL_GPL(ide_transfer_pc);
ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_atapi_pc *pc, ide_startstop_t ide_issue_pc(ide_drive_t *drive,
ide_handler_t *handler, unsigned int timeout, ide_handler_t *handler, unsigned int timeout,
ide_expiry_t *expiry) ide_expiry_t *expiry)
{ {
struct ide_atapi_pc *pc = drive->pc;
ide_hwif_t *hwif = drive->hwif; ide_hwif_t *hwif = drive->hwif;
u16 bcount; u16 bcount;
u8 dma = 0; u8 dma = 0;
......
...@@ -159,7 +159,7 @@ static void idefloppy_update_buffers(ide_drive_t *drive, ...@@ -159,7 +159,7 @@ static void idefloppy_update_buffers(ide_drive_t *drive,
static void ide_floppy_callback(ide_drive_t *drive, int dsc) 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 = drive->pc;
int uptodate = pc->error ? 0 : 1; int uptodate = pc->error ? 0 : 1;
debug_log("Reached %s\n", __func__); debug_log("Reached %s\n", __func__);
...@@ -171,7 +171,7 @@ static void ide_floppy_callback(ide_drive_t *drive, int dsc) ...@@ -171,7 +171,7 @@ static void ide_floppy_callback(ide_drive_t *drive, int dsc)
(pc->rq && blk_pc_request(pc->rq))) (pc->rq && blk_pc_request(pc->rq)))
uptodate = 1; /* FIXME */ uptodate = 1; /* FIXME */
else if (pc->c[0] == GPCMD_REQUEST_SENSE) { else if (pc->c[0] == GPCMD_REQUEST_SENSE) {
u8 *buf = floppy->pc->buf; u8 *buf = pc->buf;
if (!pc->error) { if (!pc->error) {
floppy->sense_key = buf[2] & 0x0F; floppy->sense_key = buf[2] & 0x0F;
...@@ -219,9 +219,7 @@ static void idefloppy_retry_pc(ide_drive_t *drive) ...@@ -219,9 +219,7 @@ static void idefloppy_retry_pc(ide_drive_t *drive)
/* The usual interrupt handler called during a packet command. */ /* The usual interrupt handler called during a packet command. */
static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive) static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive)
{ {
idefloppy_floppy_t *floppy = drive->driver_data; return ide_pc_intr(drive, 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, ide_io_buffers); idefloppy_retry_pc, ide_io_buffers);
} }
...@@ -234,10 +232,8 @@ static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive) ...@@ -234,10 +232,8 @@ static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive)
*/ */
static int idefloppy_transfer_pc(ide_drive_t *drive) static int idefloppy_transfer_pc(ide_drive_t *drive)
{ {
idefloppy_floppy_t *floppy = drive->driver_data;
/* Send the actual packet */ /* Send the actual packet */
drive->hwif->tp_ops->output_data(drive, NULL, floppy->pc->c, 12); drive->hwif->tp_ops->output_data(drive, NULL, drive->pc->c, 12);
/* Timeout for the packet command */ /* Timeout for the packet command */
return WAIT_FLOPPY_CMD; return WAIT_FLOPPY_CMD;
...@@ -251,7 +247,6 @@ static int idefloppy_transfer_pc(ide_drive_t *drive) ...@@ -251,7 +247,6 @@ static int idefloppy_transfer_pc(ide_drive_t *drive)
static ide_startstop_t idefloppy_start_pc_transfer(ide_drive_t *drive) static ide_startstop_t idefloppy_start_pc_transfer(ide_drive_t *drive)
{ {
idefloppy_floppy_t *floppy = drive->driver_data; idefloppy_floppy_t *floppy = drive->driver_data;
struct ide_atapi_pc *pc = floppy->pc;
ide_expiry_t *expiry; ide_expiry_t *expiry;
unsigned int timeout; unsigned int timeout;
...@@ -271,7 +266,7 @@ static ide_startstop_t idefloppy_start_pc_transfer(ide_drive_t *drive) ...@@ -271,7 +266,7 @@ static ide_startstop_t idefloppy_start_pc_transfer(ide_drive_t *drive)
expiry = NULL; expiry = NULL;
} }
return ide_transfer_pc(drive, pc, idefloppy_pc_intr, timeout, expiry); return ide_transfer_pc(drive, idefloppy_pc_intr, timeout, expiry);
} }
static void ide_floppy_report_error(idefloppy_floppy_t *floppy, static void ide_floppy_report_error(idefloppy_floppy_t *floppy,
...@@ -298,8 +293,9 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, ...@@ -298,8 +293,9 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
if (floppy->failed_pc == NULL && if (floppy->failed_pc == NULL &&
pc->c[0] != GPCMD_REQUEST_SENSE) pc->c[0] != GPCMD_REQUEST_SENSE)
floppy->failed_pc = pc; floppy->failed_pc = pc;
/* Set the current packet command */ /* Set the current packet command */
floppy->pc = pc; drive->pc = pc;
if (pc->retries > IDEFLOPPY_MAX_PC_RETRIES) { if (pc->retries > IDEFLOPPY_MAX_PC_RETRIES) {
if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR)) if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR))
...@@ -316,7 +312,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, ...@@ -316,7 +312,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
pc->retries++; pc->retries++;
return ide_issue_pc(drive, pc, idefloppy_start_pc_transfer, return ide_issue_pc(drive, idefloppy_start_pc_transfer,
WAIT_FLOPPY_CMD, NULL); WAIT_FLOPPY_CMD, NULL);
} }
......
...@@ -13,8 +13,6 @@ typedef struct ide_floppy_obj { ...@@ -13,8 +13,6 @@ typedef struct ide_floppy_obj {
struct kref kref; struct kref kref;
unsigned int openers; /* protected by BKL for now */ unsigned int openers; /* protected by BKL for now */
/* Current packet command */
struct ide_atapi_pc *pc;
/* Last failed packet command */ /* Last failed packet command */
struct ide_atapi_pc *failed_pc; struct ide_atapi_pc *failed_pc;
/* used for blk_{fs,pc}_request() requests */ /* used for blk_{fs,pc}_request() requests */
......
...@@ -172,15 +172,11 @@ typedef struct ide_tape_obj { ...@@ -172,15 +172,11 @@ typedef struct ide_tape_obj {
struct kref kref; struct kref kref;
/* /*
* pc points to the current processed packet command.
*
* failed_pc points to the last failed packet command, or contains * failed_pc points to the last failed packet command, or contains
* NULL if we do not need to retry any packet command. This is * NULL if we do not need to retry any packet command. This is
* required since an additional packet command is needed before the * required since an additional packet command is needed before the
* retry, to get detailed information on what went wrong. * retry, to get detailed information on what went wrong.
*/ */
/* Current packet command */
struct ide_atapi_pc *pc;
/* Last failed packet command */ /* Last failed packet command */
struct ide_atapi_pc *failed_pc; struct ide_atapi_pc *failed_pc;
/* used by REQ_IDETAPE_{READ,WRITE} requests */ /* used by REQ_IDETAPE_{READ,WRITE} requests */
...@@ -527,7 +523,7 @@ static void ide_tape_handle_dsc(ide_drive_t *); ...@@ -527,7 +523,7 @@ static void ide_tape_handle_dsc(ide_drive_t *);
static void ide_tape_callback(ide_drive_t *drive, int dsc) 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 = drive->pc;
int uptodate = pc->error ? 0 : 1; int uptodate = pc->error ? 0 : 1;
debug_log(DBG_PROCS, "Enter %s\n", __func__); debug_log(DBG_PROCS, "Enter %s\n", __func__);
...@@ -563,7 +559,7 @@ static void ide_tape_callback(ide_drive_t *drive, int dsc) ...@@ -563,7 +559,7 @@ static void ide_tape_callback(ide_drive_t *drive, int dsc)
if (pc->error) if (pc->error)
uptodate = pc->error; uptodate = pc->error;
} else if (pc->c[0] == READ_POSITION && uptodate) { } else if (pc->c[0] == READ_POSITION && uptodate) {
u8 *readpos = tape->pc->buf; u8 *readpos = pc->buf;
debug_log(DBG_SENSE, "BOP - %s\n", debug_log(DBG_SENSE, "BOP - %s\n",
(readpos[0] & 0x80) ? "Yes" : "No"); (readpos[0] & 0x80) ? "Yes" : "No");
...@@ -659,9 +655,7 @@ static int ide_tape_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc, ...@@ -659,9 +655,7 @@ 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) static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
{ {
idetape_tape_t *tape = drive->driver_data; return ide_pc_intr(drive, 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_io_buffers); ide_tape_io_buffers);
} }
...@@ -669,7 +663,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive) ...@@ -669,7 +663,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
/* /*
* Packet Command Interface * Packet Command Interface
* *
* The current Packet Command is available in tape->pc, and will not change * The current Packet Command is available in drive->pc, and will not change
* until we finish handling it. Each packet command is associated with a * until we finish handling it. Each packet command is associated with a
* callback function that will be called when the command is finished. * callback function that will be called when the command is finished.
* *
...@@ -704,10 +698,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive) ...@@ -704,10 +698,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
*/ */
static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive) static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive)
{ {
idetape_tape_t *tape = drive->driver_data; return ide_transfer_pc(drive, idetape_pc_intr, WAIT_TAPE_CMD, NULL);
return ide_transfer_pc(drive, tape->pc, idetape_pc_intr,
WAIT_TAPE_CMD, NULL);
} }
static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
...@@ -715,7 +706,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, ...@@ -715,7 +706,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
{ {
idetape_tape_t *tape = drive->driver_data; idetape_tape_t *tape = drive->driver_data;
if (tape->pc->c[0] == REQUEST_SENSE && if (drive->pc->c[0] == REQUEST_SENSE &&
pc->c[0] == REQUEST_SENSE) { pc->c[0] == REQUEST_SENSE) {
printk(KERN_ERR "ide-tape: possible ide-tape.c bug - " printk(KERN_ERR "ide-tape: possible ide-tape.c bug - "
"Two request sense in serial were issued\n"); "Two request sense in serial were issued\n");
...@@ -723,8 +714,9 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, ...@@ -723,8 +714,9 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
if (tape->failed_pc == NULL && pc->c[0] != REQUEST_SENSE) if (tape->failed_pc == NULL && pc->c[0] != REQUEST_SENSE)
tape->failed_pc = pc; tape->failed_pc = pc;
/* Set the current packet command */ /* Set the current packet command */
tape->pc = pc; drive->pc = pc;
if (pc->retries > IDETAPE_MAX_PC_RETRIES || if (pc->retries > IDETAPE_MAX_PC_RETRIES ||
(pc->flags & PC_FLAG_ABORT)) { (pc->flags & PC_FLAG_ABORT)) {
...@@ -755,8 +747,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, ...@@ -755,8 +747,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
pc->retries++; pc->retries++;
return ide_issue_pc(drive, pc, idetape_transfer_pc, return ide_issue_pc(drive, idetape_transfer_pc, WAIT_TAPE_CMD, NULL);
WAIT_TAPE_CMD, NULL);
} }
/* A mode sense command is used to "sense" tape parameters. */ /* A mode sense command is used to "sense" tape parameters. */
...@@ -790,7 +781,7 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) ...@@ -790,7 +781,7 @@ static ide_startstop_t idetape_media_access_finished(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;
struct ide_atapi_pc *pc = tape->pc; struct ide_atapi_pc *pc = drive->pc;
u8 stat; u8 stat;
stat = hwif->tp_ops->read_status(hwif); stat = hwif->tp_ops->read_status(hwif);
...@@ -867,7 +858,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, ...@@ -867,7 +858,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,
} }
/* Retry a failed packet command */ /* Retry a failed packet command */
if (tape->failed_pc && tape->pc->c[0] == REQUEST_SENSE) { if (tape->failed_pc && drive->pc->c[0] == REQUEST_SENSE) {
pc = tape->failed_pc; pc = tape->failed_pc;
goto out; goto out;
} }
......
...@@ -82,7 +82,6 @@ typedef struct ide_scsi_obj { ...@@ -82,7 +82,6 @@ typedef struct ide_scsi_obj {
struct gendisk *disk; struct gendisk *disk;
struct Scsi_Host *host; struct Scsi_Host *host;
struct ide_atapi_pc *pc; /* Current packet command */
unsigned long transform; /* SCSI cmd translation layer */ unsigned long transform; /* SCSI cmd translation layer */
unsigned long log; /* log flags */ unsigned long log; /* log flags */
} idescsi_scsi_t; } idescsi_scsi_t;
...@@ -140,7 +139,7 @@ static int idescsi_end_request(ide_drive_t *, int, int); ...@@ -140,7 +139,7 @@ static int idescsi_end_request(ide_drive_t *, int, int);
static void ide_scsi_callback(ide_drive_t *drive, int dsc) 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 = drive->pc;
if (pc->flags & PC_FLAG_TIMEDOUT) if (pc->flags & PC_FLAG_TIMEDOUT)
debug_log("%s: got timed out packet %lu at %lu\n", __func__, debug_log("%s: got timed out packet %lu at %lu\n", __func__,
...@@ -267,7 +266,7 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs) ...@@ -267,7 +266,7 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs)
spin_unlock_irqrestore(host->host_lock, flags); spin_unlock_irqrestore(host->host_lock, flags);
kfree(pc); kfree(pc);
blk_put_request(rq); blk_put_request(rq);
scsi->pc = NULL; drive->pc = NULL;
return 0; return 0;
} }
...@@ -278,8 +277,7 @@ static inline unsigned long get_timeout(struct ide_atapi_pc *pc) ...@@ -278,8 +277,7 @@ static inline unsigned long get_timeout(struct ide_atapi_pc *pc)
static int idescsi_expiry(ide_drive_t *drive) static int idescsi_expiry(ide_drive_t *drive)
{ {
idescsi_scsi_t *scsi = drive_to_idescsi(drive); struct ide_atapi_pc *pc = drive->pc;
struct ide_atapi_pc *pc = scsi->pc;
debug_log("%s called for %lu at %lu\n", __func__, debug_log("%s called for %lu at %lu\n", __func__,
pc->scsi_cmd->serial_number, jiffies); pc->scsi_cmd->serial_number, jiffies);
...@@ -294,19 +292,14 @@ static int idescsi_expiry(ide_drive_t *drive) ...@@ -294,19 +292,14 @@ static int idescsi_expiry(ide_drive_t *drive)
*/ */
static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
{ {
idescsi_scsi_t *scsi = drive_to_idescsi(drive); return ide_pc_intr(drive, idescsi_pc_intr, get_timeout(drive->pc),
struct ide_atapi_pc *pc = scsi->pc;
return ide_pc_intr(drive, pc, idescsi_pc_intr, get_timeout(pc),
idescsi_expiry, NULL, NULL, ide_io_buffers); idescsi_expiry, NULL, NULL, 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)
{ {
idescsi_scsi_t *scsi = drive_to_idescsi(drive); return ide_transfer_pc(drive, idescsi_pc_intr,
get_timeout(drive->pc), idescsi_expiry);
return ide_transfer_pc(drive, scsi->pc, idescsi_pc_intr,
get_timeout(scsi->pc), idescsi_expiry);
} }
static inline int idescsi_set_direction(struct ide_atapi_pc *pc) static inline int idescsi_set_direction(struct ide_atapi_pc *pc)
...@@ -351,12 +344,10 @@ static int idescsi_map_sg(ide_drive_t *drive, struct ide_atapi_pc *pc) ...@@ -351,12 +344,10 @@ static int idescsi_map_sg(ide_drive_t *drive, struct ide_atapi_pc *pc)
static ide_startstop_t idescsi_issue_pc(ide_drive_t *drive, static ide_startstop_t idescsi_issue_pc(ide_drive_t *drive,
struct ide_atapi_pc *pc) struct ide_atapi_pc *pc)
{ {
idescsi_scsi_t *scsi = drive_to_idescsi(drive);
/* Set the current packet command */ /* Set the current packet command */
scsi->pc = pc; drive->pc = pc;
return ide_issue_pc(drive, pc, idescsi_transfer_pc, return ide_issue_pc(drive, idescsi_transfer_pc,
get_timeout(pc), idescsi_expiry); get_timeout(pc), idescsi_expiry);
} }
...@@ -621,6 +612,8 @@ static int idescsi_eh_abort (struct scsi_cmnd *cmd) ...@@ -621,6 +612,8 @@ static int idescsi_eh_abort (struct scsi_cmnd *cmd)
int busy; int busy;
int ret = FAILED; int ret = FAILED;
struct ide_atapi_pc *pc;
/* In idescsi_eh_abort we try to gently pry our command from the ide subsystem */ /* In idescsi_eh_abort we try to gently pry our command from the ide subsystem */
if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
...@@ -641,26 +634,27 @@ static int idescsi_eh_abort (struct scsi_cmnd *cmd) ...@@ -641,26 +634,27 @@ static int idescsi_eh_abort (struct scsi_cmnd *cmd)
spin_lock_irq(&ide_lock); spin_lock_irq(&ide_lock);
/* If there is no pc running we're done (our interrupt took care of it) */ /* If there is no pc running we're done (our interrupt took care of it) */
if (!scsi->pc) { pc = drive->pc;
if (pc == NULL) {
ret = SUCCESS; ret = SUCCESS;
goto ide_unlock; goto ide_unlock;
} }
/* It's somewhere in flight. Does ide subsystem agree? */ /* It's somewhere in flight. Does ide subsystem agree? */
if (scsi->pc->scsi_cmd->serial_number == cmd->serial_number && !busy && if (pc->scsi_cmd->serial_number == cmd->serial_number && !busy &&
elv_queue_empty(drive->queue) && HWGROUP(drive)->rq != scsi->pc->rq) { elv_queue_empty(drive->queue) && HWGROUP(drive)->rq != pc->rq) {
/* /*
* FIXME - not sure this condition can ever occur * FIXME - not sure this condition can ever occur
*/ */
printk (KERN_ERR "ide-scsi: cmd aborted!\n"); printk (KERN_ERR "ide-scsi: cmd aborted!\n");
if (blk_sense_request(scsi->pc->rq)) if (blk_sense_request(pc->rq))
kfree(scsi->pc->buf); kfree(pc->buf);
/* we need to call blk_put_request twice. */ /* we need to call blk_put_request twice. */
blk_put_request(scsi->pc->rq); blk_put_request(pc->rq);
blk_put_request(scsi->pc->rq); blk_put_request(pc->rq);
kfree(scsi->pc); kfree(pc);
scsi->pc = NULL; drive->pc = NULL;
ret = SUCCESS; ret = SUCCESS;
} }
...@@ -682,6 +676,8 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd) ...@@ -682,6 +676,8 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
int ready = 0; int ready = 0;
int ret = SUCCESS; int ret = SUCCESS;
struct ide_atapi_pc *pc;
/* In idescsi_eh_reset we forcefully remove the command from the ide subsystem and reset the device. */ /* In idescsi_eh_reset we forcefully remove the command from the ide subsystem and reset the device. */
if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
...@@ -696,7 +692,9 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd) ...@@ -696,7 +692,9 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
spin_lock_irq(cmd->device->host->host_lock); spin_lock_irq(cmd->device->host->host_lock);
spin_lock(&ide_lock); spin_lock(&ide_lock);
if (!scsi->pc || (req = scsi->pc->rq) != HWGROUP(drive)->rq || !HWGROUP(drive)->handler) { pc = drive->pc;
if (pc == NULL || (req = pc->rq) != HWGROUP(drive)->rq || !HWGROUP(drive)->handler) {
printk (KERN_WARNING "ide-scsi: No active request in idescsi_eh_reset\n"); printk (KERN_WARNING "ide-scsi: No active request in idescsi_eh_reset\n");
spin_unlock(&ide_lock); spin_unlock(&ide_lock);
spin_unlock_irq(cmd->device->host->host_lock); spin_unlock_irq(cmd->device->host->host_lock);
...@@ -707,9 +705,9 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd) ...@@ -707,9 +705,9 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
if (__blk_end_request(req, -EIO, 0)) if (__blk_end_request(req, -EIO, 0))
BUG(); BUG();
if (blk_sense_request(req)) if (blk_sense_request(req))
kfree(scsi->pc->buf); kfree(pc->buf);
kfree(scsi->pc); kfree(pc);
scsi->pc = NULL; drive->pc = NULL;
blk_put_request(req); blk_put_request(req);
/* now nuke the drive queue */ /* now nuke the drive queue */
......
...@@ -322,6 +322,7 @@ typedef enum { ...@@ -322,6 +322,7 @@ typedef enum {
ide_started, /* a drive operation was started, handler was set */ ide_started, /* a drive operation was started, handler was set */
} ide_startstop_t; } ide_startstop_t;
struct ide_atapi_pc;
struct ide_devset; struct ide_devset;
struct ide_driver_s; struct ide_driver_s;
...@@ -484,6 +485,9 @@ struct ide_drive_s { ...@@ -484,6 +485,9 @@ struct ide_drive_s {
struct device gendev; struct device gendev;
struct completion gendev_rel_comp; /* to deal with device release() */ struct completion gendev_rel_comp; /* to deal with device release() */
/* current packet command */
struct ide_atapi_pc *pc;
/* callback for packet commands */ /* callback for packet commands */
void (*pc_callback)(struct ide_drive_s *, int); void (*pc_callback)(struct ide_drive_s *, int);
...@@ -1171,15 +1175,15 @@ int ide_do_test_unit_ready(ide_drive_t *, struct gendisk *); ...@@ -1171,15 +1175,15 @@ int ide_do_test_unit_ready(ide_drive_t *, struct gendisk *);
int ide_do_start_stop(ide_drive_t *, struct gendisk *, int); int ide_do_start_stop(ide_drive_t *, struct gendisk *, int);
int ide_set_media_lock(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, struct ide_atapi_pc *pc, ide_startstop_t ide_pc_intr(ide_drive_t *drive,
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 (*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 *,
ide_handler_t *, unsigned int, ide_expiry_t *); ide_handler_t *, unsigned int, ide_expiry_t *);
ide_startstop_t ide_issue_pc(ide_drive_t *, struct ide_atapi_pc *, ide_startstop_t ide_issue_pc(ide_drive_t *,
ide_handler_t *, unsigned int, ide_expiry_t *); ide_handler_t *, unsigned int, ide_expiry_t *);
ide_startstop_t do_rw_taskfile(ide_drive_t *, ide_task_t *); ide_startstop_t do_rw_taskfile(ide_drive_t *, ide_task_t *);
......
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