]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ata/libata-eh.c
cpumask: introduce new API, without changing anything, v3
[linux-2.6-omap-h63xx.git] / drivers / ata / libata-eh.c
index 5d687d7cffaea9a3e50d28eae19e9cffdb08c975..8077bdf5d30d1ea48c39b31386a03eee43d57592 100644 (file)
@@ -603,6 +603,9 @@ void ata_scsi_error(struct Scsi_Host *host)
                        ata_link_for_each_dev(dev, link) {
                                int devno = dev->devno;
 
+                               if (!ata_dev_enabled(dev))
+                                       continue;
+
                                ehc->saved_xfer_mode[devno] = dev->xfer_mode;
                                if (ata_ncq_enabled(dev))
                                        ehc->saved_ncq_enabled |= 1 << devno;
@@ -1161,6 +1164,7 @@ void ata_eh_detach_dev(struct ata_device *dev)
 {
        struct ata_link *link = dev->link;
        struct ata_port *ap = link->ap;
+       struct ata_eh_context *ehc = &link->eh_context;
        unsigned long flags;
 
        ata_dev_disable(dev);
@@ -1174,9 +1178,11 @@ void ata_eh_detach_dev(struct ata_device *dev)
                ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG;
        }
 
-       /* clear per-dev EH actions */
+       /* clear per-dev EH info */
        ata_eh_clear_action(link, dev, &link->eh_info, ATA_EH_PERDEV_MASK);
        ata_eh_clear_action(link, dev, &link->eh_context.i, ATA_EH_PERDEV_MASK);
+       ehc->saved_xfer_mode[dev->devno] = 0;
+       ehc->saved_ncq_enabled &= ~(1 << dev->devno);
 
        spin_unlock_irqrestore(ap->lock, flags);
 }
@@ -2787,6 +2793,9 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
 
        /* if data transfer is verified, clear DUBIOUS_XFER on ering top */
        ata_link_for_each_dev(dev, link) {
+               if (!ata_dev_enabled(dev))
+                       continue;
+
                if (!(dev->flags & ATA_DFLAG_DUBIOUS_XFER)) {
                        struct ata_ering_entry *ent;
 
@@ -2808,6 +2817,9 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
                u8 saved_xfer_mode = ehc->saved_xfer_mode[dev->devno];
                u8 saved_ncq = !!(ehc->saved_ncq_enabled & (1 << dev->devno));
 
+               if (!ata_dev_enabled(dev))
+                       continue;
+
                if (dev->xfer_mode != saved_xfer_mode ||
                    ata_ncq_enabled(dev) != saved_ncq)
                        dev->flags |= ATA_DFLAG_DUBIOUS_XFER;