diff options
-rw-r--r-- | drivers/scsi/libata-core.c | 15 | ||||
-rw-r--r-- | drivers/scsi/libata-scsi.c | 1 | ||||
-rw-r--r-- | include/linux/libata.h | 3 |
3 files changed, 11 insertions, 8 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index ccab1d7ceada..90db054fa994 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -2627,13 +2627,14 @@ int ata_std_prereset(struct ata_port *ap) | |||
2627 | const unsigned long *timing; | 2627 | const unsigned long *timing; |
2628 | int rc; | 2628 | int rc; |
2629 | 2629 | ||
2630 | /* hotplug? */ | 2630 | /* handle link resume & hotplug spinup */ |
2631 | if (ehc->i.flags & ATA_EHI_HOTPLUGGED) { | 2631 | if ((ehc->i.flags & ATA_EHI_RESUME_LINK) && |
2632 | if (ap->flags & ATA_FLAG_HRST_TO_RESUME) | 2632 | (ap->flags & ATA_FLAG_HRST_TO_RESUME)) |
2633 | ehc->i.action |= ATA_EH_HARDRESET; | 2633 | ehc->i.action |= ATA_EH_HARDRESET; |
2634 | if (ap->flags & ATA_FLAG_SKIP_D2H_BSY) | 2634 | |
2635 | ata_wait_spinup(ap); | 2635 | if ((ehc->i.flags & ATA_EHI_HOTPLUGGED) && |
2636 | } | 2636 | (ap->flags & ATA_FLAG_SKIP_D2H_BSY)) |
2637 | ata_wait_spinup(ap); | ||
2637 | 2638 | ||
2638 | /* if we're about to do hardreset, nothing more to do */ | 2639 | /* if we're about to do hardreset, nothing more to do */ |
2639 | if (ehc->i.action & ATA_EH_HARDRESET) | 2640 | if (ehc->i.action & ATA_EH_HARDRESET) |
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 153452e77264..ba3e515f2b9d 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -3011,6 +3011,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, | |||
3011 | if (dev) { | 3011 | if (dev) { |
3012 | ap->eh_info.probe_mask |= 1 << dev->devno; | 3012 | ap->eh_info.probe_mask |= 1 << dev->devno; |
3013 | ap->eh_info.action |= ATA_EH_SOFTRESET; | 3013 | ap->eh_info.action |= ATA_EH_SOFTRESET; |
3014 | ap->eh_info.flags |= ATA_EHI_RESUME_LINK; | ||
3014 | } else | 3015 | } else |
3015 | rc = -EINVAL; | 3016 | rc = -EINVAL; |
3016 | } | 3017 | } |
diff --git a/include/linux/libata.h b/include/linux/libata.h index b5d247d780f8..4d4ed2c8fec7 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -259,6 +259,7 @@ enum { | |||
259 | 259 | ||
260 | /* ata_eh_info->flags */ | 260 | /* ata_eh_info->flags */ |
261 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 261 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ |
262 | ATA_EHI_RESUME_LINK = (1 << 1), /* need to resume link */ | ||
262 | 263 | ||
263 | ATA_EHI_DID_RESET = (1 << 16), /* already reset this port */ | 264 | ATA_EHI_DID_RESET = (1 << 16), /* already reset this port */ |
264 | 265 | ||
@@ -836,7 +837,7 @@ static inline void ata_ehi_hotplugged(struct ata_eh_info *ehi) | |||
836 | if (ehi->flags & ATA_EHI_HOTPLUGGED) | 837 | if (ehi->flags & ATA_EHI_HOTPLUGGED) |
837 | return; | 838 | return; |
838 | 839 | ||
839 | ehi->flags |= ATA_EHI_HOTPLUGGED; | 840 | ehi->flags |= ATA_EHI_HOTPLUGGED | ATA_EHI_RESUME_LINK; |
840 | ehi->hotplug_timestamp = jiffies; | 841 | ehi->hotplug_timestamp = jiffies; |
841 | 842 | ||
842 | ehi->err_mask |= AC_ERR_ATA_BUS; | 843 | ehi->err_mask |= AC_ERR_ATA_BUS; |