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))
 {
        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);
 }
 
 
 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;
 
        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 */
 
 
        /* 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 */
 
        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,
 
 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;
 }