diff options
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-pmp.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index 04a486a3e7b8..0f9386d4a5a0 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
@@ -257,19 +257,6 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info) | |||
257 | goto fail; | 257 | goto fail; |
258 | } | 258 | } |
259 | 259 | ||
260 | /* turn off notification till fan-out ports are reset and configured */ | ||
261 | if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) { | ||
262 | gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY; | ||
263 | |||
264 | err_mask = sata_pmp_write(dev->link, SATA_PMP_GSCR_FEAT_EN, | ||
265 | gscr[SATA_PMP_GSCR_FEAT_EN]); | ||
266 | if (err_mask) { | ||
267 | rc = -EIO; | ||
268 | reason = "failed to write GSCR_FEAT_EN"; | ||
269 | goto fail; | ||
270 | } | ||
271 | } | ||
272 | |||
273 | if (print_info) { | 260 | if (print_info) { |
274 | ata_dev_printk(dev, KERN_INFO, "Port Multiplier %s, " | 261 | ata_dev_printk(dev, KERN_INFO, "Port Multiplier %s, " |
275 | "0x%04x:0x%04x r%d, %d ports, feat 0x%x/0x%x\n", | 262 | "0x%04x:0x%04x r%d, %d ports, feat 0x%x/0x%x\n", |
@@ -860,6 +847,7 @@ static int sata_pmp_eh_recover(struct ata_port *ap) | |||
860 | struct ata_link *pmp_link = &ap->link; | 847 | struct ata_link *pmp_link = &ap->link; |
861 | struct ata_device *pmp_dev = pmp_link->device; | 848 | struct ata_device *pmp_dev = pmp_link->device; |
862 | struct ata_eh_context *pmp_ehc = &pmp_link->eh_context; | 849 | struct ata_eh_context *pmp_ehc = &pmp_link->eh_context; |
850 | u32 *gscr = pmp_dev->gscr; | ||
863 | struct ata_link *link; | 851 | struct ata_link *link; |
864 | struct ata_device *dev; | 852 | struct ata_device *dev; |
865 | unsigned int err_mask; | 853 | unsigned int err_mask; |
@@ -897,6 +885,22 @@ static int sata_pmp_eh_recover(struct ata_port *ap) | |||
897 | if (rc) | 885 | if (rc) |
898 | goto pmp_fail; | 886 | goto pmp_fail; |
899 | 887 | ||
888 | /* PHY event notification can disturb reset and other recovery | ||
889 | * operations. Turn it off. | ||
890 | */ | ||
891 | if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) { | ||
892 | gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY; | ||
893 | |||
894 | err_mask = sata_pmp_write(pmp_link, SATA_PMP_GSCR_FEAT_EN, | ||
895 | gscr[SATA_PMP_GSCR_FEAT_EN]); | ||
896 | if (err_mask) { | ||
897 | ata_link_printk(pmp_link, KERN_WARNING, | ||
898 | "failed to disable NOTIFY (err_mask=0x%x)\n", | ||
899 | err_mask); | ||
900 | goto pmp_fail; | ||
901 | } | ||
902 | } | ||
903 | |||
900 | /* handle disabled links */ | 904 | /* handle disabled links */ |
901 | rc = sata_pmp_eh_handle_disabled_links(ap); | 905 | rc = sata_pmp_eh_handle_disabled_links(ap); |
902 | if (rc) | 906 | if (rc) |
@@ -919,10 +923,10 @@ static int sata_pmp_eh_recover(struct ata_port *ap) | |||
919 | 923 | ||
920 | /* enable notification */ | 924 | /* enable notification */ |
921 | if (pmp_dev->flags & ATA_DFLAG_AN) { | 925 | if (pmp_dev->flags & ATA_DFLAG_AN) { |
922 | pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY; | 926 | gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY; |
923 | 927 | ||
924 | err_mask = sata_pmp_write(pmp_dev->link, SATA_PMP_GSCR_FEAT_EN, | 928 | err_mask = sata_pmp_write(pmp_link, SATA_PMP_GSCR_FEAT_EN, |
925 | pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN]); | 929 | gscr[SATA_PMP_GSCR_FEAT_EN]); |
926 | if (err_mask) { | 930 | if (err_mask) { |
927 | ata_dev_printk(pmp_dev, KERN_ERR, "failed to write " | 931 | ata_dev_printk(pmp_dev, KERN_ERR, "failed to write " |
928 | "PMP_FEAT_EN (Emask=0x%x)\n", err_mask); | 932 | "PMP_FEAT_EN (Emask=0x%x)\n", err_mask); |