diff options
-rw-r--r-- | drivers/ata/libata-core.c | 10 | ||||
-rw-r--r-- | include/linux/libata.h | 1 |
2 files changed, 6 insertions, 5 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index dddcb9fde35a..5f8f57a818fb 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -5199,15 +5199,14 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp) | |||
5199 | */ | 5199 | */ |
5200 | int sata_link_init_spd(struct ata_link *link) | 5200 | int sata_link_init_spd(struct ata_link *link) |
5201 | { | 5201 | { |
5202 | u32 scontrol; | ||
5203 | u8 spd; | 5202 | u8 spd; |
5204 | int rc; | 5203 | int rc; |
5205 | 5204 | ||
5206 | rc = sata_scr_read(link, SCR_CONTROL, &scontrol); | 5205 | rc = sata_scr_read(link, SCR_CONTROL, &link->saved_scontrol); |
5207 | if (rc) | 5206 | if (rc) |
5208 | return rc; | 5207 | return rc; |
5209 | 5208 | ||
5210 | spd = (scontrol >> 4) & 0xf; | 5209 | spd = (link->saved_scontrol >> 4) & 0xf; |
5211 | if (spd) | 5210 | if (spd) |
5212 | link->hw_sata_spd_limit &= (1 << spd) - 1; | 5211 | link->hw_sata_spd_limit &= (1 << spd) - 1; |
5213 | 5212 | ||
@@ -5794,9 +5793,10 @@ static void ata_port_detach(struct ata_port *ap) | |||
5794 | ata_port_wait_eh(ap); | 5793 | ata_port_wait_eh(ap); |
5795 | 5794 | ||
5796 | /* EH is now guaranteed to see UNLOADING - EH context belongs | 5795 | /* EH is now guaranteed to see UNLOADING - EH context belongs |
5797 | * to us. Disable all existing devices. | 5796 | * to us. Restore SControl and disable all existing devices. |
5798 | */ | 5797 | */ |
5799 | ata_port_for_each_link(link, ap) { | 5798 | __ata_port_for_each_link(link, ap) { |
5799 | sata_scr_write(link, SCR_CONTROL, link->saved_scontrol); | ||
5800 | ata_link_for_each_dev(dev, link) | 5800 | ata_link_for_each_dev(dev, link) |
5801 | ata_dev_disable(dev); | 5801 | ata_dev_disable(dev); |
5802 | } | 5802 | } |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 5340d4c83fd9..80233fdc159f 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -647,6 +647,7 @@ struct ata_link { | |||
647 | 647 | ||
648 | unsigned int flags; /* ATA_LFLAG_xxx */ | 648 | unsigned int flags; /* ATA_LFLAG_xxx */ |
649 | 649 | ||
650 | u32 saved_scontrol; /* SControl on probe */ | ||
650 | unsigned int hw_sata_spd_limit; | 651 | unsigned int hw_sata_spd_limit; |
651 | unsigned int sata_spd_limit; | 652 | unsigned int sata_spd_limit; |
652 | unsigned int sata_spd; /* current SATA PHY speed */ | 653 | unsigned int sata_spd; /* current SATA PHY speed */ |