libata: kill ATA_EHI_RESUME_LINK
authorTejun Heo <htejun@gmail.com>
Wed, 23 Jan 2008 15:05:14 +0000 (00:05 +0900)
committerJeff Garzik <jgarzik@redhat.com>
Thu, 17 Apr 2008 19:44:16 +0000 (15:44 -0400)
ATA_EHI_RESUME_LINK has two functions - promote reset to hardreset if
ATA_LFLAG_HRST_TO_RESUME is set and preventing EH from shortcutting
reset action when probing is requested.  The former is gone now and
the latter can easily be achieved by making EH to perform at least one
reset if reset is requested, which also makes more sense than
depending on RESUME_LINK flag.

As ATA_EHI_RESUME_LINK was the only EHI reset modifier, this also
kills reset modifier handling.

Signed-off-by: Tejun Heo <htejun@gmail.com>
drivers/ata/libata-eh.c
drivers/ata/libata-pmp.c
drivers/ata/libata-scsi.c
include/linux/libata.h

index f7cae640015528aeeb211cf28ee64ef98f685d89..e6584fa7f456d4e4c1d31bf09b93216540efc3ca 100644 (file)
@@ -1079,12 +1079,6 @@ void ata_eh_about_to_do(struct ata_link *link, struct ata_device *dev,
 
        spin_lock_irqsave(ap->lock, flags);
 
-       /* suck in and clear reset modifier */
-       if (action & ATA_EH_RESET) {
-               ehc->i.flags |= ehi->flags & ATA_EHI_RESET_MODIFIER_MASK;
-               ehi->flags &= ~ATA_EHI_RESET_MODIFIER_MASK;
-       }
-
        ata_eh_clear_action(link, dev, ehi, action);
 
        if (!(ehc->i.flags & ATA_EHI_QUIET))
@@ -1110,10 +1104,6 @@ void ata_eh_done(struct ata_link *link, struct ata_device *dev,
 {
        struct ata_eh_context *ehc = &link->eh_context;
 
-       /* if reset is complete, clear reset modifier */
-       if (action & ATA_EH_RESET)
-               ehc->i.flags &= ~ATA_EHI_RESET_MODIFIER_MASK;
-
        ata_eh_clear_action(link, dev, &ehc->i, action);
 }
 
@@ -2491,6 +2481,7 @@ static int ata_link_nr_vacant(struct ata_link *link)
 
 static int ata_eh_skip_recovery(struct ata_link *link)
 {
+       struct ata_port *ap = link->ap;
        struct ata_eh_context *ehc = &link->eh_context;
        struct ata_device *dev;
 
@@ -2498,9 +2489,13 @@ static int ata_eh_skip_recovery(struct ata_link *link)
        if (link->flags & ATA_LFLAG_DISABLED)
                return 1;
 
-       /* thaw frozen port, resume link and recover failed devices */
-       if ((link->ap->pflags & ATA_PFLAG_FROZEN) ||
-           (ehc->i.flags & ATA_EHI_RESUME_LINK) || ata_link_nr_enabled(link))
+       /* thaw frozen port and recover failed devices */
+       if ((ap->pflags & ATA_PFLAG_FROZEN) || ata_link_nr_enabled(link))
+               return 0;
+
+       /* reset at least once if reset is requested */
+       if ((ehc->i.action & ATA_EH_RESET) &&
+           !(ehc->i.flags & ATA_EHI_DID_RESET))
                return 0;
 
        /* skip if class codes for all vacant slots are ATA_DEV_NONE */
index 7f8bcffa81ad78a002a6201403de82717b6889bf..df1d3252b9e611946279f6e0de52bc070b1cb51f 100644 (file)
@@ -437,7 +437,6 @@ static int sata_pmp_init_links(struct ata_port *ap, int nr_ports)
                link->flags = 0;
                ehc->i.probe_mask |= 1;
                ehc->i.action |= ATA_EH_RESET;
-               ehc->i.flags |= ATA_EHI_RESUME_LINK;
        }
 
        return 0;
index 1f036a7b14f39bb77d10dea43b56e00314bfa3cb..caffca7dd76f72a6a20dcfcccc4ceba91b8154af 100644 (file)
@@ -3517,7 +3517,6 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
                        struct ata_eh_info *ehi = &dev->link->eh_info;
                        ehi->probe_mask |= 1 << dev->devno;
                        ehi->action |= ATA_EH_RESET;
-                       ehi->flags |= ATA_EHI_RESUME_LINK;
                } else
                        rc = -EINVAL;
        }
index 1524af6f018b7892ef5dfca573bbf60afdc76996..4093e3b6a8b7b13ddc257ca965eba751cca3e1b1 100644 (file)
@@ -301,7 +301,6 @@ enum {
 
        /* ata_eh_info->flags */
        ATA_EHI_HOTPLUGGED      = (1 << 0),  /* could have been hotplugged */
-       ATA_EHI_RESUME_LINK     = (1 << 1),  /* resume link (reset modifier) */
        ATA_EHI_NO_AUTOPSY      = (1 << 2),  /* no autopsy */
        ATA_EHI_QUIET           = (1 << 3),  /* be quiet */
 
@@ -312,7 +311,6 @@ enum {
        ATA_EHI_POST_SETMODE    = (1 << 20), /* revaildating after setmode */
 
        ATA_EHI_DID_RESET       = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET,
-       ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK,
 
        /* max tries if error condition is still set after ->error_handler */
        ATA_EH_MAX_TRIES        = 5,
@@ -1095,7 +1093,6 @@ extern void ata_ehi_clear_desc(struct ata_eh_info *ehi);
 
 static inline void ata_ehi_schedule_probe(struct ata_eh_info *ehi)
 {
-       ehi->flags |= ATA_EHI_RESUME_LINK;
        ehi->action |= ATA_EH_RESET;
        ehi->probe_mask |= (1 << ATA_MAX_DEVICES) - 1;
 }