aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-06-11 03:11:36 -0400
committerTejun Heo <tj@kernel.org>2013-06-11 03:14:34 -0400
commit7a87718d92760fc688628ad6a430643dafa16f1f (patch)
treef9701fcc877208cb06d05542681695be6feeb57b /drivers/ata
parent912b9ac683b112615d5605686f1dc086402ce9f7 (diff)
libata: skip SRST for all SIMG [34]7x port-multipliers
For some reason, a lot of port-multipliers have issues with softreset. SIMG [34]7x series port-multipliers have been quite erratic in this regard. I recall that it was better with some firmware revisions and the current list of quirks worked fine for a while. I think it got worse with later firmwares or maybe my test coverage wasn't good enough. Anyways, HPA is reporting that his 3726 setup suffers SRST failures and then the PMP gets confused and fails to probe the last port. The hope was that we try to stick to the standard as much as possible and soonish the PMPs and their firmwares will improve in quality, so the quirk list was kept to minimum. Well, it seems like that's never gonna happen. Let's set NO_SRST for all [34]7x PMPs so that whatever remaining userbase of the device suffer the least. Maybe we should do the same for 57xx's but unfortunately I don't have any device left to test and I'm not even sure 57xx's have ever been made widely available, so let's leave those alone for now. Signed-off-by: Tejun Heo <tj@kernel.org> Reported-by: "H. Peter Anvin" <hpa@zytor.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-pmp.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
index 61c59ee45ce9..1c41722bb7e2 100644
--- a/drivers/ata/libata-pmp.c
+++ b/drivers/ata/libata-pmp.c
@@ -389,9 +389,13 @@ static void sata_pmp_quirks(struct ata_port *ap)
389 /* link reports offline after LPM */ 389 /* link reports offline after LPM */
390 link->flags |= ATA_LFLAG_NO_LPM; 390 link->flags |= ATA_LFLAG_NO_LPM;
391 391
392 /* Class code report is unreliable. */ 392 /*
393 * Class code report is unreliable and SRST times
394 * out under certain configurations.
395 */
393 if (link->pmp < 5) 396 if (link->pmp < 5)
394 link->flags |= ATA_LFLAG_ASSUME_ATA; 397 link->flags |= ATA_LFLAG_NO_SRST |
398 ATA_LFLAG_ASSUME_ATA;
395 399
396 /* port 5 is for SEMB device and it doesn't like SRST */ 400 /* port 5 is for SEMB device and it doesn't like SRST */
397 if (link->pmp == 5) 401 if (link->pmp == 5)
@@ -399,20 +403,17 @@ static void sata_pmp_quirks(struct ata_port *ap)
399 ATA_LFLAG_ASSUME_SEMB; 403 ATA_LFLAG_ASSUME_SEMB;
400 } 404 }
401 } else if (vendor == 0x1095 && devid == 0x4723) { 405 } else if (vendor == 0x1095 && devid == 0x4723) {
402 /* sil4723 quirks */ 406 /*
403 ata_for_each_link(link, ap, EDGE) { 407 * sil4723 quirks
404 /* link reports offline after LPM */ 408 *
405 link->flags |= ATA_LFLAG_NO_LPM; 409 * Link reports offline after LPM. Class code report is
406 410 * unreliable. SIMG PMPs never got SRST reliable and the
407 /* class code report is unreliable */ 411 * config device at port 2 locks up on SRST.
408 if (link->pmp < 2) 412 */
409 link->flags |= ATA_LFLAG_ASSUME_ATA; 413 ata_for_each_link(link, ap, EDGE)
410 414 link->flags |= ATA_LFLAG_NO_LPM |
411 /* the config device at port 2 locks up on SRST */ 415 ATA_LFLAG_NO_SRST |
412 if (link->pmp == 2) 416 ATA_LFLAG_ASSUME_ATA;
413 link->flags |= ATA_LFLAG_NO_SRST |
414 ATA_LFLAG_ASSUME_ATA;
415 }
416 } else if (vendor == 0x1095 && devid == 0x4726) { 417 } else if (vendor == 0x1095 && devid == 0x4726) {
417 /* sil4726 quirks */ 418 /* sil4726 quirks */
418 ata_for_each_link(link, ap, EDGE) { 419 ata_for_each_link(link, ap, EDGE) {