aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/ahci.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-04-25 15:41:55 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-25 15:41:55 -0400
commit50be4917ee70218f59e04dec029121b97fb9cb3d (patch)
tree0261422c5130ec9f6370c0a55638c657baa00d9e /drivers/ata/ahci.c
parent37b05b17985ecc43a33e2a8cbdaa220115de4703 (diff)
parentf9d42491723dbb77bdc9b9dc7e096ea57d535992 (diff)
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: pata_bf54x: decrease count first. sata_mv: re-enable hotplug, update TODO list sata_mv: leave SError bits untouched in mv_err_intr sata_mv: more interrupt handling rework sata_mv: tidy host controller interrupt handling sata_mv: simplify request/response queue handling sata_mv: simplify freeze/thaw bit-shift calculations sata_mv mask all interrupt coalescing bits sata_mv more cosmetics ata_piix: add Asus Eee 701 controller to short cable list libata-eh set tf flags in NCQ EH result_tf make sata_set_spd_needed() static make sata_print_link_status() static libata-acpi.c: remove unneeded #if's sata_nv: make hardreset return -EAGAIN on success ahci: retry enabling AHCI a few times before spitting out WARN_ON() libata: make WARN_ON conditions in ata_sff_hsm_move() more strict ATA/IDE: fix platform driver hotplug/coldplug sata_sis: SCR accessors return -EINVAL when requested SCR isn't available libata: functions with definition should not be extern
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r--drivers/ata/ahci.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 986e3324e302..7c4f886f1f16 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -556,16 +556,27 @@ static inline void __iomem *ahci_port_base(struct ata_port *ap)
556 556
557static void ahci_enable_ahci(void __iomem *mmio) 557static void ahci_enable_ahci(void __iomem *mmio)
558{ 558{
559 int i;
559 u32 tmp; 560 u32 tmp;
560 561
561 /* turn on AHCI_EN */ 562 /* turn on AHCI_EN */
562 tmp = readl(mmio + HOST_CTL); 563 tmp = readl(mmio + HOST_CTL);
563 if (!(tmp & HOST_AHCI_EN)) { 564 if (tmp & HOST_AHCI_EN)
565 return;
566
567 /* Some controllers need AHCI_EN to be written multiple times.
568 * Try a few times before giving up.
569 */
570 for (i = 0; i < 5; i++) {
564 tmp |= HOST_AHCI_EN; 571 tmp |= HOST_AHCI_EN;
565 writel(tmp, mmio + HOST_CTL); 572 writel(tmp, mmio + HOST_CTL);
566 tmp = readl(mmio + HOST_CTL); /* flush && sanity check */ 573 tmp = readl(mmio + HOST_CTL); /* flush && sanity check */
567 WARN_ON(!(tmp & HOST_AHCI_EN)); 574 if (tmp & HOST_AHCI_EN)
575 return;
576 msleep(10);
568 } 577 }
578
579 WARN_ON(1);
569} 580}
570 581
571/** 582/**