diff options
author | James Smart <james.smart@emulex.com> | 2010-07-14 15:30:54 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-07-28 10:05:40 -0400 |
commit | 589a52d6a97e01c5ff6c244ee6c8ea57726c610f (patch) | |
tree | c8df31220d1b46c792552cd04fe4697a12af139d /drivers/scsi/lpfc/lpfc_sli.c | |
parent | 75576bb9b208d7c66822f310cdef9ca2d72c879c (diff) |
[SCSI] lpfc 8.3.15: BSG, Discovery, and Misc fixes
- BSG interface related:
- Fix node reference count if node is active
- Warn if we're overwriting an active CT context
- Discovery related:
- Clear "Ignore Reg Login" flag when purging mailbox queue
- Pay attention to return code for fc_block_scsi_eh()
- Stall device loss code if we're almost done when it fires
(we're logged in, but PRLI is outstanding)
- Bugs
- Correct DIF code for endianness issues
- Correct where we had missed points to check txq on i/o
completion/cleanup
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_sli.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 7ddf52682271..086f95261605 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -601,15 +601,8 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) | |||
601 | list_add(&sglq->list, &phba->sli4_hba.lpfc_sgl_list); | 601 | list_add(&sglq->list, &phba->sli4_hba.lpfc_sgl_list); |
602 | 602 | ||
603 | /* Check if TXQ queue needs to be serviced */ | 603 | /* Check if TXQ queue needs to be serviced */ |
604 | if (pring->txq_cnt) { | 604 | if (pring->txq_cnt) |
605 | spin_lock_irqsave( | ||
606 | &phba->pport->work_port_lock, iflag); | ||
607 | phba->pport->work_port_events |= | ||
608 | WORKER_SERVICE_TXQ; | ||
609 | lpfc_worker_wake_up(phba); | 605 | lpfc_worker_wake_up(phba); |
610 | spin_unlock_irqrestore( | ||
611 | &phba->pport->work_port_lock, iflag); | ||
612 | } | ||
613 | } | 606 | } |
614 | } | 607 | } |
615 | 608 | ||
@@ -12757,6 +12750,7 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport) | |||
12757 | LPFC_MBOXQ_t *mb, *nextmb; | 12750 | LPFC_MBOXQ_t *mb, *nextmb; |
12758 | struct lpfc_dmabuf *mp; | 12751 | struct lpfc_dmabuf *mp; |
12759 | struct lpfc_nodelist *ndlp; | 12752 | struct lpfc_nodelist *ndlp; |
12753 | struct Scsi_Host *shost = lpfc_shost_from_vport(vport); | ||
12760 | 12754 | ||
12761 | spin_lock_irq(&phba->hbalock); | 12755 | spin_lock_irq(&phba->hbalock); |
12762 | list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) { | 12756 | list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) { |
@@ -12778,6 +12772,9 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport) | |||
12778 | } | 12772 | } |
12779 | ndlp = (struct lpfc_nodelist *) mb->context2; | 12773 | ndlp = (struct lpfc_nodelist *) mb->context2; |
12780 | if (ndlp) { | 12774 | if (ndlp) { |
12775 | spin_lock_irq(shost->host_lock); | ||
12776 | ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; | ||
12777 | spin_unlock_irq(shost->host_lock); | ||
12781 | lpfc_nlp_put(ndlp); | 12778 | lpfc_nlp_put(ndlp); |
12782 | mb->context2 = NULL; | 12779 | mb->context2 = NULL; |
12783 | } | 12780 | } |
@@ -12793,6 +12790,9 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport) | |||
12793 | if (mb->u.mb.mbxCommand == MBX_REG_LOGIN64) { | 12790 | if (mb->u.mb.mbxCommand == MBX_REG_LOGIN64) { |
12794 | ndlp = (struct lpfc_nodelist *) mb->context2; | 12791 | ndlp = (struct lpfc_nodelist *) mb->context2; |
12795 | if (ndlp) { | 12792 | if (ndlp) { |
12793 | spin_lock_irq(shost->host_lock); | ||
12794 | ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; | ||
12795 | spin_unlock_irq(shost->host_lock); | ||
12796 | lpfc_nlp_put(ndlp); | 12796 | lpfc_nlp_put(ndlp); |
12797 | mb->context2 = NULL; | 12797 | mb->context2 = NULL; |
12798 | } | 12798 | } |
@@ -12879,10 +12879,6 @@ lpfc_drain_txq(struct lpfc_hba *phba) | |||
12879 | spin_unlock_irqrestore(&phba->hbalock, iflags); | 12879 | spin_unlock_irqrestore(&phba->hbalock, iflags); |
12880 | } | 12880 | } |
12881 | 12881 | ||
12882 | spin_lock_irqsave(&phba->pport->work_port_lock, iflags); | ||
12883 | phba->pport->work_port_events &= ~WORKER_SERVICE_TXQ; | ||
12884 | spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags); | ||
12885 | |||
12886 | /* Cancel all the IOCBs that cannot be issued */ | 12882 | /* Cancel all the IOCBs that cannot be issued */ |
12887 | lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT, | 12883 | lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT, |
12888 | IOERR_SLI_ABORTED); | 12884 | IOERR_SLI_ABORTED); |