ide: add PC_FLAG_DRQ_INTERRUPT pc flag
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Tue, 15 Jul 2008 19:21:59 +0000 (21:21 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Tue, 15 Jul 2008 19:21:59 +0000 (21:21 +0200)
Add PC_FLAG_DRQ_INTERRUPT pc flag, set it in ide*_do_request()
and check for it (instead of checking for IDE*_FLAG_DRQ_INTERRUPT)
in ide*_issue_pc().  This is a preparation for adding generic
ide_issue_pc() helper.

There should be no functional changes caused by this patch.

Cc: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-floppy.c
drivers/ide/ide-tape.c
drivers/scsi/ide-scsi.c
include/linux/ide.h

index e7a1025..13f650f 100644 (file)
@@ -619,7 +619,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
 
        ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_DEVICE, bcount, dma);
 
-       if (floppy->flags & IDEFLOPPY_FLAG_DRQ_INTERRUPT) {
+       if (pc->flags & PC_FLAG_DRQ_INTERRUPT) {
                /* Issue the packet command */
                ide_execute_command(drive, WIN_PACKETCMD,
                                &idefloppy_transfer_pc1,
@@ -800,6 +800,9 @@ static ide_startstop_t idefloppy_do_request(ide_drive_t *drive,
                return ide_stopped;
        }
 
+       if (floppy->flags & IDEFLOPPY_FLAG_DRQ_INTERRUPT)
+               pc->flags |= PC_FLAG_DRQ_INTERRUPT;
+
        if (floppy->flags & IDEFLOPPY_FLAG_ZIP_DRIVE)
                pc->flags |= PC_FLAG_ZIP_DRIVE;
 
index 5adc2c9..cba18a6 100644 (file)
@@ -1020,7 +1020,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
 
        ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_DEVICE, bcount, dma_ok);
 
-       if (test_bit(IDETAPE_FLAG_DRQ_INTERRUPT, &tape->flags)) {
+       if (pc->flags & PC_FLAG_DRQ_INTERRUPT) {
                ide_execute_command(drive, WIN_PACKETCMD, &idetape_transfer_pc,
                                    IDETAPE_WAIT_CMD, NULL);
                return ide_started;
@@ -1143,8 +1143,10 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,
        }
 
        /* Retry a failed packet command */
-       if (tape->failed_pc && tape->pc->c[0] == REQUEST_SENSE)
-               return idetape_issue_pc(drive, tape->failed_pc);
+       if (tape->failed_pc && tape->pc->c[0] == REQUEST_SENSE) {
+               pc = tape->failed_pc;
+               goto out;
+       }
 
        if (postponed_rq != NULL)
                if (rq != postponed_rq) {
@@ -1216,6 +1218,9 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,
        }
        BUG();
 out:
+       if (test_bit(IDETAPE_FLAG_DRQ_INTERRUPT, &tape->flags))
+               pc->flags |= PC_FLAG_DRQ_INTERRUPT;
+
        return idetape_issue_pc(drive, pc);
 }
 
index 1d26129..b7c5e83 100644 (file)
@@ -525,7 +525,7 @@ static ide_startstop_t idescsi_issue_pc(ide_drive_t *drive,
 
        ide_pktcmd_tf_load(drive, 0, bcount, dma);
 
-       if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags)) {
+       if (pc->flags & PC_FLAG_DRQ_INTERRUPT) {
                ide_execute_command(drive, WIN_PACKETCMD, &idescsi_transfer_pc,
                                    get_timeout(pc), idescsi_expiry);
                return ide_started;
@@ -548,6 +548,10 @@ static ide_startstop_t idescsi_do_request (ide_drive_t *drive, struct request *r
 
        if (blk_sense_request(rq) || blk_special_request(rq)) {
                struct ide_atapi_pc *pc = (struct ide_atapi_pc *)rq->special;
+               idescsi_scsi_t *scsi = drive_to_idescsi(drive);
+
+               if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags))
+                       pc->flags |= PC_FLAG_DRQ_INTERRUPT;
 
                if (drive->using_dma && !idescsi_map_sg(drive, pc))
                        pc->flags |= PC_FLAG_DMA_OK;
index bed3c58..c2274ad 100644 (file)
@@ -608,6 +608,7 @@ enum {
        /* command timed out */
        PC_FLAG_TIMEDOUT                = (1 << 7),
        PC_FLAG_ZIP_DRIVE               = (1 << 8),
+       PC_FLAG_DRQ_INTERRUPT           = (1 << 9),
 };
 
 struct ide_atapi_pc {