]> err.no Git - linux-2.6/blobdiff - drivers/scsi/libata-scsi.c
[PATCH] libata: add ATA_QCFLAG_IO
[linux-2.6] / drivers / scsi / libata-scsi.c
index 628191bfd990a56e039611e8332bafda0ce07c92..234e1cadb070db1b5a26dcba693a1d884d5281d4 100644 (file)
@@ -779,20 +779,15 @@ enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd)
 
 int ata_scsi_error(struct Scsi_Host *host)
 {
-       struct ata_port *ap;
-       unsigned long flags;
+       struct ata_port *ap = (struct ata_port *)&host->hostdata[0];
 
        DPRINTK("ENTER\n");
 
-       ap = (struct ata_port *) &host->hostdata[0];
+       /* synchronize with IRQ handler and port task */
+       spin_unlock_wait(&ap->host_set->lock);
+       ata_port_flush_task(ap);
 
-       spin_lock_irqsave(&ap->host_set->lock, flags);
-       WARN_ON(ap->flags & ATA_FLAG_IN_EH);
-       ap->flags |= ATA_FLAG_IN_EH;
        WARN_ON(ata_qc_from_tag(ap, ap->active_tag) == NULL);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
-
-       ata_port_flush_task(ap);
 
        ap->ops->eng_timeout(ap);
 
@@ -800,10 +795,6 @@ int ata_scsi_error(struct Scsi_Host *host)
 
        scsi_eh_flush_done_q(&ap->eh_done_q);
 
-       spin_lock_irqsave(&ap->host_set->lock, flags);
-       ap->flags &= ~ATA_FLAG_IN_EH;
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
-
        DPRINTK("EXIT\n");
        return 0;
 }
@@ -1197,6 +1188,7 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm
        u64 block;
        u32 n_block;
 
+       qc->flags |= ATA_QCFLAG_IO;
        tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
 
        if (scsicmd[0] == WRITE_10 || scsicmd[0] == WRITE_6 ||
@@ -1431,9 +1423,7 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev,
                goto early_finish;
 
        /* select device, send command to hardware */
-       qc->err_mask = ata_qc_issue(qc);
-       if (qc->err_mask)
-               ata_qc_complete(qc);
+       ata_qc_issue(qc);
 
        VPRINTK("EXIT\n");
        return;
@@ -2199,9 +2189,7 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
 
        qc->complete_fn = atapi_sense_complete;
 
-       qc->err_mask = ata_qc_issue(qc);
-       if (qc->err_mask)
-               ata_qc_complete(qc);
+       ata_qc_issue(qc);
 
        DPRINTK("EXIT\n");
 }
@@ -2353,7 +2341,7 @@ ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev)
                     (scsidev->lun != 0)))
                return NULL;
 
-       if (unlikely(!ata_dev_present(dev)))
+       if (unlikely(!ata_dev_enabled(dev)))
                return NULL;
 
        if (!atapi_enabled || (ap->flags & ATA_FLAG_NO_ATAPI)) {
@@ -2741,13 +2729,13 @@ void ata_scsi_scan_host(struct ata_port *ap)
        struct ata_device *dev;
        unsigned int i;
 
-       if (ap->flags & ATA_FLAG_PORT_DISABLED)
+       if (ap->flags & ATA_FLAG_DISABLED)
                return;
 
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                dev = &ap->device[i];
 
-               if (ata_dev_present(dev))
+               if (ata_dev_enabled(dev))
                        scsi_scan_target(&ap->host->shost_gendev, 0, i, 0, 0);
        }
 }