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_bsg.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_bsg.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_bsg.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c index 55f984166dbc..d521569e6620 100644 --- a/drivers/scsi/lpfc/lpfc_bsg.c +++ b/drivers/scsi/lpfc/lpfc_bsg.c | |||
@@ -962,10 +962,22 @@ lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
962 | if (phba->sli_rev == LPFC_SLI_REV4) { | 962 | if (phba->sli_rev == LPFC_SLI_REV4) { |
963 | evt_dat->immed_dat = phba->ctx_idx; | 963 | evt_dat->immed_dat = phba->ctx_idx; |
964 | phba->ctx_idx = (phba->ctx_idx + 1) % 64; | 964 | phba->ctx_idx = (phba->ctx_idx + 1) % 64; |
965 | /* Provide warning for over-run of the ct_ctx array */ | ||
966 | if (phba->ct_ctx[evt_dat->immed_dat].flags & | ||
967 | UNSOL_VALID) | ||
968 | lpfc_printf_log(phba, KERN_WARNING, LOG_ELS, | ||
969 | "2717 CT context array entry " | ||
970 | "[%d] over-run: oxid:x%x, " | ||
971 | "sid:x%x\n", phba->ctx_idx, | ||
972 | phba->ct_ctx[ | ||
973 | evt_dat->immed_dat].oxid, | ||
974 | phba->ct_ctx[ | ||
975 | evt_dat->immed_dat].SID); | ||
965 | phba->ct_ctx[evt_dat->immed_dat].oxid = | 976 | phba->ct_ctx[evt_dat->immed_dat].oxid = |
966 | piocbq->iocb.ulpContext; | 977 | piocbq->iocb.ulpContext; |
967 | phba->ct_ctx[evt_dat->immed_dat].SID = | 978 | phba->ct_ctx[evt_dat->immed_dat].SID = |
968 | piocbq->iocb.un.rcvels.remoteID; | 979 | piocbq->iocb.un.rcvels.remoteID; |
980 | phba->ct_ctx[evt_dat->immed_dat].flags = UNSOL_VALID; | ||
969 | } else | 981 | } else |
970 | evt_dat->immed_dat = piocbq->iocb.ulpContext; | 982 | evt_dat->immed_dat = piocbq->iocb.ulpContext; |
971 | 983 | ||
@@ -1323,6 +1335,21 @@ lpfc_issue_ct_rsp(struct lpfc_hba *phba, struct fc_bsg_job *job, uint32_t tag, | |||
1323 | rc = IOCB_ERROR; | 1335 | rc = IOCB_ERROR; |
1324 | goto issue_ct_rsp_exit; | 1336 | goto issue_ct_rsp_exit; |
1325 | } | 1337 | } |
1338 | |||
1339 | /* Check if the ndlp is active */ | ||
1340 | if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) { | ||
1341 | rc = -IOCB_ERROR; | ||
1342 | goto issue_ct_rsp_exit; | ||
1343 | } | ||
1344 | |||
1345 | /* get a refernece count so the ndlp doesn't go away while | ||
1346 | * we respond | ||
1347 | */ | ||
1348 | if (!lpfc_nlp_get(ndlp)) { | ||
1349 | rc = -IOCB_ERROR; | ||
1350 | goto issue_ct_rsp_exit; | ||
1351 | } | ||
1352 | |||
1326 | icmd->un.ulpWord[3] = ndlp->nlp_rpi; | 1353 | icmd->un.ulpWord[3] = ndlp->nlp_rpi; |
1327 | /* The exchange is done, mark the entry as invalid */ | 1354 | /* The exchange is done, mark the entry as invalid */ |
1328 | phba->ct_ctx[tag].flags &= ~UNSOL_VALID; | 1355 | phba->ct_ctx[tag].flags &= ~UNSOL_VALID; |