diff options
-rw-r--r-- | drivers/ata/libata-eh.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 01831312c360..eb8b94016c01 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2783,6 +2783,12 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, | |||
2783 | } else if (dev->class == ATA_DEV_UNKNOWN && | 2783 | } else if (dev->class == ATA_DEV_UNKNOWN && |
2784 | ehc->tries[dev->devno] && | 2784 | ehc->tries[dev->devno] && |
2785 | ata_class_enabled(ehc->classes[dev->devno])) { | 2785 | ata_class_enabled(ehc->classes[dev->devno])) { |
2786 | /* Temporarily set dev->class, it will be | ||
2787 | * permanently set once all configurations are | ||
2788 | * complete. This is necessary because new | ||
2789 | * device configuration is done in two | ||
2790 | * separate loops. | ||
2791 | */ | ||
2786 | dev->class = ehc->classes[dev->devno]; | 2792 | dev->class = ehc->classes[dev->devno]; |
2787 | 2793 | ||
2788 | if (dev->class == ATA_DEV_PMP) | 2794 | if (dev->class == ATA_DEV_PMP) |
@@ -2790,6 +2796,11 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, | |||
2790 | else | 2796 | else |
2791 | rc = ata_dev_read_id(dev, &dev->class, | 2797 | rc = ata_dev_read_id(dev, &dev->class, |
2792 | readid_flags, dev->id); | 2798 | readid_flags, dev->id); |
2799 | |||
2800 | /* read_id might have changed class, store and reset */ | ||
2801 | ehc->classes[dev->devno] = dev->class; | ||
2802 | dev->class = ATA_DEV_UNKNOWN; | ||
2803 | |||
2793 | switch (rc) { | 2804 | switch (rc) { |
2794 | case 0: | 2805 | case 0: |
2795 | /* clear error info accumulated during probe */ | 2806 | /* clear error info accumulated during probe */ |
@@ -2799,13 +2810,11 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, | |||
2799 | case -ENOENT: | 2810 | case -ENOENT: |
2800 | /* IDENTIFY was issued to non-existent | 2811 | /* IDENTIFY was issued to non-existent |
2801 | * device. No need to reset. Just | 2812 | * device. No need to reset. Just |
2802 | * thaw and kill the device. | 2813 | * thaw and ignore the device. |
2803 | */ | 2814 | */ |
2804 | ata_eh_thaw_port(ap); | 2815 | ata_eh_thaw_port(ap); |
2805 | dev->class = ATA_DEV_UNKNOWN; | ||
2806 | break; | 2816 | break; |
2807 | default: | 2817 | default: |
2808 | dev->class = ATA_DEV_UNKNOWN; | ||
2809 | goto err; | 2818 | goto err; |
2810 | } | 2819 | } |
2811 | } | 2820 | } |
@@ -2826,11 +2835,15 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, | |||
2826 | dev->class == ATA_DEV_PMP) | 2835 | dev->class == ATA_DEV_PMP) |
2827 | continue; | 2836 | continue; |
2828 | 2837 | ||
2838 | dev->class = ehc->classes[dev->devno]; | ||
2839 | |||
2829 | ehc->i.flags |= ATA_EHI_PRINTINFO; | 2840 | ehc->i.flags |= ATA_EHI_PRINTINFO; |
2830 | rc = ata_dev_configure(dev); | 2841 | rc = ata_dev_configure(dev); |
2831 | ehc->i.flags &= ~ATA_EHI_PRINTINFO; | 2842 | ehc->i.flags &= ~ATA_EHI_PRINTINFO; |
2832 | if (rc) | 2843 | if (rc) { |
2844 | dev->class = ATA_DEV_UNKNOWN; | ||
2833 | goto err; | 2845 | goto err; |
2846 | } | ||
2834 | 2847 | ||
2835 | spin_lock_irqsave(ap->lock, flags); | 2848 | spin_lock_irqsave(ap->lock, flags); |
2836 | ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG; | 2849 | ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG; |