diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-25 15:41:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-25 15:41:55 -0400 |
commit | 50be4917ee70218f59e04dec029121b97fb9cb3d (patch) | |
tree | 0261422c5130ec9f6370c0a55638c657baa00d9e /drivers/ata/ahci.c | |
parent | 37b05b17985ecc43a33e2a8cbdaa220115de4703 (diff) | |
parent | f9d42491723dbb77bdc9b9dc7e096ea57d535992 (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.c | 15 |
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 | ||
557 | static void ahci_enable_ahci(void __iomem *mmio) | 557 | static 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 | /** |