Merge tag 'dlm-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm
[cascardo/linux.git] / drivers / scsi / hpsa.h
index 24472ce..8e06d9e 100644 (file)
@@ -118,7 +118,7 @@ struct ctlr_info {
        struct CfgTable __iomem *cfgtable;
        int     interrupts_enabled;
        int     max_commands;
-       int     commands_outstanding;
+       atomic_t commands_outstanding;
 #      define PERF_MODE_INT    0
 #      define DOORBELL_INT     1
 #      define SIMPLE_MODE_INT  2
@@ -164,7 +164,7 @@ struct ctlr_info {
         */
        u32 trans_support;
        u32 trans_offset;
-       struct TransTable_struct *transtable;
+       struct TransTable_struct __iomem *transtable;
        unsigned long transMethod;
 
        /* cap concurrent passthrus at some reasonable maximum */
@@ -181,7 +181,7 @@ struct ctlr_info {
        u32 *blockFetchTable;
        u32 *ioaccel1_blockFetchTable;
        u32 *ioaccel2_blockFetchTable;
-       u32 *ioaccel2_bft2_regs;
+       u32 __iomem *ioaccel2_bft2_regs;
        unsigned char *hba_inquiry_data;
        u32 driver_support;
        u32 fw_support;
@@ -192,7 +192,7 @@ struct ctlr_info {
        u64 last_heartbeat_timestamp;
        u32 heartbeat_sample_interval;
        atomic_t firmware_flash_in_progress;
-       u32 *lockup_detected;
+       u32 __percpu *lockup_detected;
        struct delayed_work monitor_ctlr_work;
        int remove_in_progress;
        u32 fifo_recently_full;
@@ -395,7 +395,7 @@ static void SA5_performant_intr_mask(struct ctlr_info *h, unsigned long val)
 static unsigned long SA5_performant_completed(struct ctlr_info *h, u8 q)
 {
        struct reply_queue_buffer *rq = &h->reply_queue[q];
-       unsigned long flags, register_value = FIFO_EMPTY;
+       unsigned long register_value = FIFO_EMPTY;
 
        /* msi auto clears the interrupt pending bit. */
        if (!(h->msi_vector || h->msix_vector)) {
@@ -413,9 +413,7 @@ static unsigned long SA5_performant_completed(struct ctlr_info *h, u8 q)
        if ((rq->head[rq->current_entry] & 1) == rq->wraparound) {
                register_value = rq->head[rq->current_entry];
                rq->current_entry++;
-               spin_lock_irqsave(&h->lock, flags);
-               h->commands_outstanding--;
-               spin_unlock_irqrestore(&h->lock, flags);
+               atomic_dec(&h->commands_outstanding);
        } else {
                register_value = FIFO_EMPTY;
        }
@@ -433,11 +431,7 @@ static unsigned long SA5_performant_completed(struct ctlr_info *h, u8 q)
  */
 static unsigned long SA5_fifo_full(struct ctlr_info *h)
 {
-       if (h->commands_outstanding >= h->max_commands)
-               return 1;
-       else
-               return 0;
-
+       return atomic_read(&h->commands_outstanding) >= h->max_commands;
 }
 /*
  *   returns value read from hardware.
@@ -448,13 +442,9 @@ static unsigned long SA5_completed(struct ctlr_info *h,
 {
        unsigned long register_value
                = readl(h->vaddr + SA5_REPLY_PORT_OFFSET);
-       unsigned long flags;
 
-       if (register_value != FIFO_EMPTY) {
-               spin_lock_irqsave(&h->lock, flags);
-               h->commands_outstanding--;
-               spin_unlock_irqrestore(&h->lock, flags);
-       }
+       if (register_value != FIFO_EMPTY)
+               atomic_dec(&h->commands_outstanding);
 
 #ifdef HPSA_DEBUG
        if (register_value != FIFO_EMPTY)
@@ -510,7 +500,6 @@ static unsigned long SA5_ioaccel_mode1_completed(struct ctlr_info *h, u8 q)
 {
        u64 register_value;
        struct reply_queue_buffer *rq = &h->reply_queue[q];
-       unsigned long flags;
 
        BUG_ON(q >= h->nreply_queues);
 
@@ -528,9 +517,7 @@ static unsigned long SA5_ioaccel_mode1_completed(struct ctlr_info *h, u8 q)
                wmb();
                writel((q << 24) | rq->current_entry, h->vaddr +
                                IOACCEL_MODE1_CONSUMER_INDEX);
-               spin_lock_irqsave(&h->lock, flags);
-               h->commands_outstanding--;
-               spin_unlock_irqrestore(&h->lock, flags);
+               atomic_dec(&h->commands_outstanding);
        }
        return (unsigned long) register_value;
 }