| From stable-bounces@linux.kernel.org Fri Jul 18 17:06:59 2008 |
| From: Tejun Heo <htejun@gmail.com> |
| Date: Fri, 18 Jul 2008 19:14:40 -0400 |
| Subject: ahci: retry enabling AHCI a few times before spitting out WARN_ON() |
| To: stable@kernel.org |
| Cc: Jeff Garzik <jgarzik@redhat.com> |
| Message-ID: <20080718191440.708f5f4a@redhat.com> |
| |
| From: Tejun Heo <htejun@gmail.com> |
| |
| commit 15fe982e429e0e6b7466719acb6cfd9dbfe47f0c upstream |
| |
| ahci: retry enabling AHCI a few times before spitting out WARN_ON() |
| |
| Some chips need AHCI_EN set more than once to actually set it. Try a |
| few times before giving up and spitting out WARN_ON(). |
| |
| Signed-off-by: Tejun Heo <htejun@gmail.com> |
| Cc: Peer Chen <pchen@nvidia.com> |
| Cc: Volker Armin Hemmann <volker.armin.hemmann@tu-clausthal.de> |
| Signed-off-by: Jeff Garzik <jgarzik@redhat.com> |
| Cc: Chuck Ebbert <cebbert@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/ata/ahci.c | 15 +++++++++++++-- |
| 1 file changed, 13 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/ata/ahci.c |
| +++ b/drivers/ata/ahci.c |
| @@ -634,16 +634,27 @@ static inline void __iomem *ahci_port_ba |
| |
| static void ahci_enable_ahci(void __iomem *mmio) |
| { |
| + int i; |
| u32 tmp; |
| |
| /* turn on AHCI_EN */ |
| tmp = readl(mmio + HOST_CTL); |
| - if (!(tmp & HOST_AHCI_EN)) { |
| + if (tmp & HOST_AHCI_EN) |
| + return; |
| + |
| + /* Some controllers need AHCI_EN to be written multiple times. |
| + * Try a few times before giving up. |
| + */ |
| + for (i = 0; i < 5; i++) { |
| tmp |= HOST_AHCI_EN; |
| writel(tmp, mmio + HOST_CTL); |
| tmp = readl(mmio + HOST_CTL); /* flush && sanity check */ |
| - WARN_ON(!(tmp & HOST_AHCI_EN)); |
| + if (tmp & HOST_AHCI_EN) |
| + return; |
| + msleep(10); |
| } |
| + |
| + WARN_ON(1); |
| } |
| |
| /** |