]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/scsi/esas2r/esas2r_int.c
Merge remote-tracking branch 'scsi/for-next'
[karo-tx-linux.git] / drivers / scsi / esas2r / esas2r_int.c
index c2d4ff57c5c3f0ab2381ef6b6a773cc1699b7efe..f16d6bcf9bb6db3f3c3e5b381fdb312d315cad55 100644 (file)
@@ -96,7 +96,7 @@ irqreturn_t esas2r_interrupt(int irq, void *dev_id)
        if (!esas2r_adapter_interrupt_pending(a))
                return IRQ_NONE;
 
-       esas2r_lock_set_flags(&a->flags2, AF2_INT_PENDING);
+       set_bit(AF2_INT_PENDING, &a->flags2);
        esas2r_schedule_tasklet(a);
 
        return IRQ_HANDLED;
@@ -317,9 +317,10 @@ void esas2r_do_deferred_processes(struct esas2r_adapter *a)
         *  = 2 - can start any request
         */
 
-       if (a->flags & (AF_CHPRST_PENDING | AF_FLASHING))
+       if (test_bit(AF_CHPRST_PENDING, &a->flags) ||
+           test_bit(AF_FLASHING, &a->flags))
                startreqs = 0;
-       else if (a->flags & AF_DISC_PENDING)
+       else if (test_bit(AF_DISC_PENDING, &a->flags))
                startreqs = 1;
 
        atomic_inc(&a->disable_cnt);
@@ -367,7 +368,7 @@ void esas2r_do_deferred_processes(struct esas2r_adapter *a)
                                 * Flashing could have been set by last local
                                 * start
                                 */
-                               if (a->flags & AF_FLASHING)
+                               if (test_bit(AF_FLASHING, &a->flags))
                                        break;
                        }
                }
@@ -404,7 +405,7 @@ void esas2r_process_adapter_reset(struct esas2r_adapter *a)
 
                dc->disc_evt = 0;
 
-               esas2r_lock_clear_flags(&a->flags, AF_DISC_IN_PROG);
+               clear_bit(AF_DISC_IN_PROG, &a->flags);
        }
 
        /*
@@ -425,7 +426,7 @@ void esas2r_process_adapter_reset(struct esas2r_adapter *a)
                a->last_write =
                        a->last_read = a->list_size - 1;
 
-       esas2r_lock_set_flags(&a->flags, AF_COMM_LIST_TOGGLE);
+       set_bit(AF_COMM_LIST_TOGGLE, &a->flags);
 
        /* Kill all the requests on the active list */
        list_for_each(element, &a->defer_list) {
@@ -470,7 +471,7 @@ static void esas2r_process_bus_reset(struct esas2r_adapter *a)
        if (atomic_read(&a->disable_cnt) == 0)
                esas2r_do_deferred_processes(a);
 
-       esas2r_lock_clear_flags(&a->flags, AF_OS_RESET);
+       clear_bit(AF_OS_RESET, &a->flags);
 
        esas2r_trace_exit();
 }
@@ -478,10 +479,10 @@ static void esas2r_process_bus_reset(struct esas2r_adapter *a)
 static void esas2r_chip_rst_needed_during_tasklet(struct esas2r_adapter *a)
 {
 
-       esas2r_lock_clear_flags(&a->flags, AF_CHPRST_NEEDED);
-       esas2r_lock_clear_flags(&a->flags, AF_BUSRST_NEEDED);
-       esas2r_lock_clear_flags(&a->flags, AF_BUSRST_DETECTED);
-       esas2r_lock_clear_flags(&a->flags, AF_BUSRST_PENDING);
+       clear_bit(AF_CHPRST_NEEDED, &a->flags);
+       clear_bit(AF_BUSRST_NEEDED, &a->flags);
+       clear_bit(AF_BUSRST_DETECTED, &a->flags);
+       clear_bit(AF_BUSRST_PENDING, &a->flags);
        /*
         * Make sure we don't get attempt more than 3 resets
         * when the uptime between resets does not exceed one
@@ -507,10 +508,10 @@ static void esas2r_chip_rst_needed_during_tasklet(struct esas2r_adapter *a)
                 * prevent the heartbeat from trying to recover.
                 */
 
-               esas2r_lock_set_flags(&a->flags, AF_DEGRADED_MODE);
-               esas2r_lock_set_flags(&a->flags, AF_DISABLED);
-               esas2r_lock_clear_flags(&a->flags, AF_CHPRST_PENDING);
-               esas2r_lock_clear_flags(&a->flags, AF_DISC_PENDING);
+               set_bit(AF_DEGRADED_MODE, &a->flags);
+               set_bit(AF_DISABLED, &a->flags);
+               clear_bit(AF_CHPRST_PENDING, &a->flags);
+               clear_bit(AF_DISC_PENDING, &a->flags);
 
                esas2r_disable_chip_interrupts(a);
                a->int_mask = 0;
@@ -519,18 +520,17 @@ static void esas2r_chip_rst_needed_during_tasklet(struct esas2r_adapter *a)
                esas2r_log(ESAS2R_LOG_CRIT,
                           "Adapter disabled because of hardware failure");
        } else {
-               u32 flags =
-                       esas2r_lock_set_flags(&a->flags, AF_CHPRST_STARTED);
+               bool alrdyrst = test_and_set_bit(AF_CHPRST_STARTED, &a->flags);
 
-               if (!(flags & AF_CHPRST_STARTED))
+               if (!alrdyrst)
                        /*
                         * Only disable interrupts if this is
                         * the first reset attempt.
                         */
                        esas2r_disable_chip_interrupts(a);
 
-               if ((a->flags & AF_POWER_MGT) && !(a->flags & AF_FIRST_INIT) &&
-                   !(flags & AF_CHPRST_STARTED)) {
+               if ((test_bit(AF_POWER_MGT, &a->flags)) &&
+                   !test_bit(AF_FIRST_INIT, &a->flags) && !alrdyrst) {
                        /*
                         * Don't reset the chip on the first
                         * deferred power up attempt.
@@ -543,10 +543,10 @@ static void esas2r_chip_rst_needed_during_tasklet(struct esas2r_adapter *a)
                /* Kick off the reinitialization */
                a->chip_uptime += ESAS2R_CHP_UPTIME_CNT;
                a->chip_init_time = jiffies_to_msecs(jiffies);
-               if (!(a->flags & AF_POWER_MGT)) {
+               if (!test_bit(AF_POWER_MGT, &a->flags)) {
                        esas2r_process_adapter_reset(a);
 
-                       if (!(flags & AF_CHPRST_STARTED)) {
+                       if (!alrdyrst) {
                                /* Remove devices now that I/O is cleaned up. */
                                a->prev_dev_cnt =
                                        esas2r_targ_db_get_tgt_cnt(a);
@@ -560,38 +560,37 @@ static void esas2r_chip_rst_needed_during_tasklet(struct esas2r_adapter *a)
 
 static void esas2r_handle_chip_rst_during_tasklet(struct esas2r_adapter *a)
 {
-       while (a->flags & AF_CHPRST_DETECTED) {
+       while (test_bit(AF_CHPRST_DETECTED, &a->flags)) {
                /*
                 * Balance the enable in esas2r_initadapter_hw.
                 * Esas2r_power_down already took care of it for power
                 * management.
                 */
-               if (!(a->flags & AF_DEGRADED_MODE) && !(a->flags &
-                                                       AF_POWER_MGT))
+               if (!test_bit(AF_DEGRADED_MODE, &a->flags) &&
+                   !test_bit(AF_POWER_MGT, &a->flags))
                        esas2r_disable_chip_interrupts(a);
 
                /* Reinitialize the chip. */
                esas2r_check_adapter(a);
                esas2r_init_adapter_hw(a, 0);
 
-               if (a->flags & AF_CHPRST_NEEDED)
+               if (test_bit(AF_CHPRST_NEEDED, &a->flags))
                        break;
 
-               if (a->flags & AF_POWER_MGT) {
+               if (test_bit(AF_POWER_MGT, &a->flags)) {
                        /* Recovery from power management. */
-                       if (a->flags & AF_FIRST_INIT) {
+                       if (test_bit(AF_FIRST_INIT, &a->flags)) {
                                /* Chip reset during normal power up */
                                esas2r_log(ESAS2R_LOG_CRIT,
                                           "The firmware was reset during a normal power-up sequence");
                        } else {
                                /* Deferred power up complete. */
-                               esas2r_lock_clear_flags(&a->flags,
-                                                       AF_POWER_MGT);
+                               clear_bit(AF_POWER_MGT, &a->flags);
                                esas2r_send_reset_ae(a, true);
                        }
                } else {
                        /* Recovery from online chip reset. */
-                       if (a->flags & AF_FIRST_INIT) {
+                       if (test_bit(AF_FIRST_INIT, &a->flags)) {
                                /* Chip reset during driver load */
                        } else {
                                /* Chip reset after driver load */
@@ -602,14 +601,14 @@ static void esas2r_handle_chip_rst_during_tasklet(struct esas2r_adapter *a)
                                   "Recovering from a chip reset while the chip was online");
                }
 
-               esas2r_lock_clear_flags(&a->flags, AF_CHPRST_STARTED);
+               clear_bit(AF_CHPRST_STARTED, &a->flags);
                esas2r_enable_chip_interrupts(a);
 
                /*
                 * Clear this flag last!  this indicates that the chip has been
                 * reset already during initialization.
                 */
-               esas2r_lock_clear_flags(&a->flags, AF_CHPRST_DETECTED);
+               clear_bit(AF_CHPRST_DETECTED, &a->flags);
        }
 }
 
@@ -617,26 +616,28 @@ static void esas2r_handle_chip_rst_during_tasklet(struct esas2r_adapter *a)
 /* Perform deferred tasks when chip interrupts are disabled */
 void esas2r_do_tasklet_tasks(struct esas2r_adapter *a)
 {
-       if (a->flags & (AF_CHPRST_NEEDED | AF_CHPRST_DETECTED)) {
-               if (a->flags & AF_CHPRST_NEEDED)
+
+       if (test_bit(AF_CHPRST_NEEDED, &a->flags) ||
+           test_bit(AF_CHPRST_DETECTED, &a->flags)) {
+               if (test_bit(AF_CHPRST_NEEDED, &a->flags))
                        esas2r_chip_rst_needed_during_tasklet(a);
 
                esas2r_handle_chip_rst_during_tasklet(a);
        }
 
-       if (a->flags & AF_BUSRST_NEEDED) {
+       if (test_bit(AF_BUSRST_NEEDED, &a->flags)) {
                esas2r_hdebug("hard resetting bus");
 
-               esas2r_lock_clear_flags(&a->flags, AF_BUSRST_NEEDED);
+               clear_bit(AF_BUSRST_NEEDED, &a->flags);
 
-               if (a->flags & AF_FLASHING)
-                       esas2r_lock_set_flags(&a->flags, AF_BUSRST_DETECTED);
+               if (test_bit(AF_FLASHING, &a->flags))
+                       set_bit(AF_BUSRST_DETECTED, &a->flags);
                else
                        esas2r_write_register_dword(a, MU_DOORBELL_IN,
                                                    DRBL_RESET_BUS);
        }
 
-       if (a->flags & AF_BUSRST_DETECTED) {
+       if (test_bit(AF_BUSRST_DETECTED, &a->flags)) {
                esas2r_process_bus_reset(a);
 
                esas2r_log_dev(ESAS2R_LOG_WARN,
@@ -645,14 +646,14 @@ void esas2r_do_tasklet_tasks(struct esas2r_adapter *a)
 
                scsi_report_bus_reset(a->host, 0);
 
-               esas2r_lock_clear_flags(&a->flags, AF_BUSRST_DETECTED);
-               esas2r_lock_clear_flags(&a->flags, AF_BUSRST_PENDING);
+               clear_bit(AF_BUSRST_DETECTED, &a->flags);
+               clear_bit(AF_BUSRST_PENDING, &a->flags);
 
                esas2r_log(ESAS2R_LOG_WARN, "Bus reset complete");
        }
 
-       if (a->flags & AF_PORT_CHANGE) {
-               esas2r_lock_clear_flags(&a->flags, AF_PORT_CHANGE);
+       if (test_bit(AF_PORT_CHANGE, &a->flags)) {
+               clear_bit(AF_PORT_CHANGE, &a->flags);
 
                esas2r_targ_db_report_changes(a);
        }
@@ -672,10 +673,10 @@ static void esas2r_doorbell_interrupt(struct esas2r_adapter *a, u32 doorbell)
        esas2r_write_register_dword(a, MU_DOORBELL_OUT, doorbell);
 
        if (doorbell & DRBL_RESET_BUS)
-               esas2r_lock_set_flags(&a->flags, AF_BUSRST_DETECTED);
+               set_bit(AF_BUSRST_DETECTED, &a->flags);
 
        if (doorbell & DRBL_FORCE_INT)
-               esas2r_lock_clear_flags(&a->flags, AF_HEARTBEAT);
+               clear_bit(AF_HEARTBEAT, &a->flags);
 
        if (doorbell & DRBL_PANIC_REASON_MASK) {
                esas2r_hdebug("*** Firmware Panic ***");
@@ -683,7 +684,7 @@ static void esas2r_doorbell_interrupt(struct esas2r_adapter *a, u32 doorbell)
        }
 
        if (doorbell & DRBL_FW_RESET) {
-               esas2r_lock_set_flags(&a->flags2, AF2_COREDUMP_AVAIL);
+               set_bit(AF2_COREDUMP_AVAIL, &a->flags2);
                esas2r_local_reset_adapter(a);
        }
 
@@ -918,7 +919,7 @@ void esas2r_complete_request(struct esas2r_adapter *a,
 {
        if (rq->vrq->scsi.function == VDA_FUNC_FLASH
            && rq->vrq->flash.sub_func == VDA_FLASH_COMMIT)
-               esas2r_lock_clear_flags(&a->flags, AF_FLASHING);
+               clear_bit(AF_FLASHING, &a->flags);
 
        /* See if we setup a callback to do special processing */