[SCSI] lpfc 8.3.40: Fixed issue mailbox wait routine failed to issue dump memory...
authorJames Smart <james.smart@emulex.com>
Fri, 31 May 2013 21:05:27 +0000 (17:05 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Wed, 26 Jun 2013 17:48:53 +0000 (10:48 -0700)
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc_sli.c

index 876e61b5036bafa62a0182bfd4652cdcf912bcf9..bb78e4d45db970a8f042615a21e4036bece9c6e8 100644 (file)
@@ -10092,12 +10092,13 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
                         uint32_t timeout)
 {
        DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q);
+       MAILBOX_t *mb = NULL;
        int retval;
        unsigned long flag;
 
-       /* The caller must leave context1 empty. */
+       /* The caller might set context1 for extended buffer */
        if (pmboxq->context1)
-               return MBX_NOT_FINISHED;
+               mb = (MAILBOX_t *)pmboxq->context1;
 
        pmboxq->mbox_flag &= ~LPFC_MBX_WAKE;
        /* setup wake call as IOCB callback */
@@ -10113,7 +10114,8 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
                                msecs_to_jiffies(timeout * 1000));
 
                spin_lock_irqsave(&phba->hbalock, flag);
-               pmboxq->context1 = NULL;
+               /* restore the possible extended buffer for free resource */
+               pmboxq->context1 = (uint8_t *)mb;
                /*
                 * if LPFC_MBX_WAKE flag is set the mailbox is completed
                 * else do not free the resources.
@@ -10126,6 +10128,9 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
                        pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
                }
                spin_unlock_irqrestore(&phba->hbalock, flag);
+       } else {
+               /* restore the possible extended buffer for free resource */
+               pmboxq->context1 = (uint8_t *)mb;
        }
 
        return retval;