+++ /dev/null
-From 4c1e9aa41b2f9afe8f26e2efe5bb4695f6c40772 Mon Sep 17 00:00:00 2001
-From: David Milburn <dmilburn@redhat.com>
-Date: Fri, 3 Apr 2009 15:36:41 -0500
-Subject: libata: ahci enclosure management bios workaround
-References: bnc#489005
-
-During driver initialization ahci_start_port may not be able
-to turn LEDs off because the hardware may still be transmitting
-a message. And since the BIOS may not be setting the LEDs to
-off the drive LEDs may end up in a fault state. This has
-been seen on ICH9r and ICH10r when configured in AHCI mode
-instead of RAID mode, this patch doesn't key off a specific
-set of device IDs but will give the EM transmit bit a chance
-to clear if busy.
-
-Signed-off-by: David Milburn <dmilburn@redhat.com>
-Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-Signed-off-by: Tejun Heo <teheo@suse.de>
----
- drivers/ata/ahci.c | 17 +++++++++++++++--
- 1 file changed, 15 insertions(+), 2 deletions(-)
-
-Index: linux-2.6.27-SLE11_BRANCH/drivers/ata/ahci.c
-===================================================================
---- linux-2.6.27-SLE11_BRANCH.orig/drivers/ata/ahci.c
-+++ linux-2.6.27-SLE11_BRANCH/drivers/ata/ahci.c
-@@ -62,6 +62,7 @@ static ssize_t ahci_led_store(struct ata
- static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
- ssize_t size);
- #define MAX_SLOTS 8
-+#define MAX_RETRY 15
-
- enum {
- AHCI_PCI_BAR = 5,
-@@ -1095,6 +1096,8 @@ static void ahci_start_port(struct ata_p
- struct ahci_port_priv *pp = ap->private_data;
- struct ata_link *link;
- struct ahci_em_priv *emp;
-+ ssize_t rc;
-+ int i;
-
- /* enable FIS reception */
- ahci_start_fis_rx(ap);
-@@ -1106,7 +1109,17 @@ static void ahci_start_port(struct ata_p
- if (ap->flags & ATA_FLAG_EM) {
- ata_port_for_each_link(link, ap) {
- emp = &pp->em_priv[link->pmp];
-- ahci_transmit_led_message(ap, emp->led_state, 4);
-+
-+ /* EM Transmit bit maybe busy during init */
-+ for (i = 0; i < MAX_RETRY; i++) {
-+ rc = ahci_transmit_led_message(ap,
-+ emp->led_state,
-+ 4);
-+ if (rc == -EBUSY)
-+ udelay(100);
-+ else
-+ break;
-+ }
- }
- }
-
-@@ -1308,7 +1321,7 @@ static ssize_t ahci_transmit_led_message
- em_ctl = readl(mmio + HOST_EM_CTL);
- if (em_ctl & EM_CTL_TM) {
- spin_unlock_irqrestore(ap->lock, flags);
-- return -EINVAL;
-+ return -EBUSY;
- }
-
- /*