libata: ahci enclosure management led sync
authorDavid Milburn <dmilburn@redhat.com>
Thu, 16 Oct 2008 14:26:19 +0000 (09:26 -0500)
committerJeff Garzik <jgarzik@redhat.com>
Tue, 28 Oct 2008 04:36:10 +0000 (00:36 -0400)
Synchronize ahci_sw_activity and ahci_sw_activity_blink with ata_port lock.

Signed-off-by: David Milburn <dmilburn@redhat.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/ahci.c

index 289719b2cb30392e49ab3c59707c8d967be621d6..3c71d31334315a0a5c20c5920efb4f66d6f70dfe 100644 (file)
@@ -1223,6 +1223,7 @@ static void ahci_sw_activity_blink(unsigned long arg)
        struct ahci_em_priv *emp = &pp->em_priv[link->pmp];
        unsigned long led_message = emp->led_state;
        u32 activity_led_state;
+       unsigned long flags;
 
        led_message &= 0xffff0000;
        led_message |= ap->port_no | (link->pmp << 8);
@@ -1231,6 +1232,7 @@ static void ahci_sw_activity_blink(unsigned long arg)
         * toggle state of LED and reset timer.  If not,
         * turn LED to desired idle state.
         */
+       spin_lock_irqsave(ap->lock, flags);
        if (emp->saved_activity != emp->activity) {
                emp->saved_activity = emp->activity;
                /* get the current LED state */
@@ -1253,6 +1255,7 @@ static void ahci_sw_activity_blink(unsigned long arg)
                if (emp->blink_policy == BLINK_OFF)
                        led_message |= (1 << 16);
        }
+       spin_unlock_irqrestore(ap->lock, flags);
        ahci_transmit_led_message(ap, led_message, 4);
 }