[SCSI] hpsa: factor out tail calls to next_command() in process_(non)indexed_cmd()
authorStephen M. Cameron <scameron@beardog.cce.hp.com>
Tue, 1 May 2012 16:43:01 +0000 (11:43 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Thu, 10 May 2012 08:15:46 +0000 (09:15 +0100)
This is in order to smooth the way for upcoming changes to allow use of
multiple reply queues for command completions.

Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: Matt Gates <matthew.gates@hp.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/hpsa.c

index 87f8a1b8d2eaad30a9f433e037b26b08c9a12611..bf5ed873a33ed092699f0eead7cf890903f52ad4 100644 (file)
@@ -3379,22 +3379,21 @@ static inline u32 hpsa_tag_discard_error_bits(struct ctlr_info *h, u32 tag)
 }
 
 /* process completion of an indexed ("direct lookup") command */
-static inline u32 process_indexed_cmd(struct ctlr_info *h,
+static inline void process_indexed_cmd(struct ctlr_info *h,
        u32 raw_tag)
 {
        u32 tag_index;
        struct CommandList *c;
 
        tag_index = hpsa_tag_to_index(raw_tag);
-       if (bad_tag(h, tag_index, raw_tag))
-               return next_command(h);
-       c = h->cmd_pool + tag_index;
-       finish_cmd(c);
-       return next_command(h);
+       if (!bad_tag(h, tag_index, raw_tag)) {
+               c = h->cmd_pool + tag_index;
+               finish_cmd(c);
+       }
 }
 
 /* process completion of a non-indexed command */
-static inline u32 process_nonindexed_cmd(struct ctlr_info *h,
+static inline void process_nonindexed_cmd(struct ctlr_info *h,
        u32 raw_tag)
 {
        u32 tag;
@@ -3404,11 +3403,10 @@ static inline u32 process_nonindexed_cmd(struct ctlr_info *h,
        list_for_each_entry(c, &h->cmpQ, list) {
                if ((c->busaddr & 0xFFFFFFE0) == (tag & 0xFFFFFFE0)) {
                        finish_cmd(c);
-                       return next_command(h);
+                       return;
                }
        }
        bad_tag(h, h->nr_cmds + 1, raw_tag);
-       return next_command(h);
 }
 
 /* Some controllers, like p400, will give us one interrupt
@@ -3483,10 +3481,11 @@ static irqreturn_t do_hpsa_intr_intx(int irq, void *dev_id)
        while (interrupt_pending(h)) {
                raw_tag = get_next_completion(h);
                while (raw_tag != FIFO_EMPTY) {
-                       if (hpsa_tag_contains_index(raw_tag))
-                               raw_tag = process_indexed_cmd(h, raw_tag);
+                       if (likely(hpsa_tag_contains_index(raw_tag)))
+                               process_indexed_cmd(h, raw_tag);
                        else
-                               raw_tag = process_nonindexed_cmd(h, raw_tag);
+                               process_nonindexed_cmd(h, raw_tag);
+                       raw_tag = next_command(h);
                }
        }
        spin_unlock_irqrestore(&h->lock, flags);
@@ -3503,10 +3502,11 @@ static irqreturn_t do_hpsa_intr_msi(int irq, void *dev_id)
        h->last_intr_timestamp = get_jiffies_64();
        raw_tag = get_next_completion(h);
        while (raw_tag != FIFO_EMPTY) {
-               if (hpsa_tag_contains_index(raw_tag))
-                       raw_tag = process_indexed_cmd(h, raw_tag);
+               if (likely(hpsa_tag_contains_index(raw_tag)))
+                       process_indexed_cmd(h, raw_tag);
                else
-                       raw_tag = process_nonindexed_cmd(h, raw_tag);
+                       process_nonindexed_cmd(h, raw_tag);
+               raw_tag = next_command(h);
        }
        spin_unlock_irqrestore(&h->lock, flags);
        return IRQ_HANDLED;