diff options
author | James Smart <james.smart@emulex.com> | 2012-05-09 21:19:14 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2012-05-17 06:10:25 -0400 |
commit | ee0f4fe17b0fda87c7f4eb3ec6e96ef8291419bd (patch) | |
tree | 946eb55e8aa32e7682b4672d73500b9b1a4b3109 /drivers/scsi/lpfc | |
parent | 939723a4a680a7863fc95179b1480c5529f31d88 (diff) |
[SCSI] lpfc 8.3.31: Fix unsol abts xri lookup
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_els.c | 8 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 9 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 22 |
3 files changed, 25 insertions, 14 deletions
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 379397d17aca..d54ae1999797 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c | |||
@@ -3003,7 +3003,7 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, | |||
3003 | * ABTS we cannot generate and RRQ. | 3003 | * ABTS we cannot generate and RRQ. |
3004 | */ | 3004 | */ |
3005 | lpfc_set_rrq_active(phba, ndlp, | 3005 | lpfc_set_rrq_active(phba, ndlp, |
3006 | cmdiocb->sli4_xritag, 0, 0); | 3006 | cmdiocb->sli4_lxritag, 0, 0); |
3007 | } | 3007 | } |
3008 | break; | 3008 | break; |
3009 | case IOSTAT_LOCAL_REJECT: | 3009 | case IOSTAT_LOCAL_REJECT: |
@@ -5673,7 +5673,7 @@ lpfc_issue_els_rrq(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | |||
5673 | pcmd += sizeof(uint32_t); | 5673 | pcmd += sizeof(uint32_t); |
5674 | els_rrq = (struct RRQ *) pcmd; | 5674 | els_rrq = (struct RRQ *) pcmd; |
5675 | 5675 | ||
5676 | bf_set(rrq_oxid, els_rrq, rrq->xritag); | 5676 | bf_set(rrq_oxid, els_rrq, phba->sli4_hba.xri_ids[rrq->xritag]); |
5677 | bf_set(rrq_rxid, els_rrq, rrq->rxid); | 5677 | bf_set(rrq_rxid, els_rrq, rrq->rxid); |
5678 | bf_set(rrq_did, els_rrq, vport->fc_myDID); | 5678 | bf_set(rrq_did, els_rrq, vport->fc_myDID); |
5679 | els_rrq->rrq = cpu_to_be32(els_rrq->rrq); | 5679 | els_rrq->rrq = cpu_to_be32(els_rrq->rrq); |
@@ -7960,7 +7960,9 @@ lpfc_sli4_els_xri_aborted(struct lpfc_hba *phba, | |||
7960 | sglq_entry->state = SGL_FREED; | 7960 | sglq_entry->state = SGL_FREED; |
7961 | spin_unlock(&phba->sli4_hba.abts_sgl_list_lock); | 7961 | spin_unlock(&phba->sli4_hba.abts_sgl_list_lock); |
7962 | spin_unlock_irqrestore(&phba->hbalock, iflag); | 7962 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
7963 | lpfc_set_rrq_active(phba, ndlp, xri, rxid, 1); | 7963 | lpfc_set_rrq_active(phba, ndlp, |
7964 | sglq_entry->sli4_lxritag, | ||
7965 | rxid, 1); | ||
7964 | 7966 | ||
7965 | /* Check if TXQ queue needs to be serviced */ | 7967 | /* Check if TXQ queue needs to be serviced */ |
7966 | if (pring->txq_cnt) | 7968 | if (pring->txq_cnt) |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 9434b0379abe..b410555f3a83 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -696,7 +696,8 @@ lpfc_sli4_fcp_xri_aborted(struct lpfc_hba *phba, | |||
696 | rrq_empty = list_empty(&phba->active_rrq_list); | 696 | rrq_empty = list_empty(&phba->active_rrq_list); |
697 | spin_unlock_irqrestore(&phba->hbalock, iflag); | 697 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
698 | if (ndlp) { | 698 | if (ndlp) { |
699 | lpfc_set_rrq_active(phba, ndlp, xri, rxid, 1); | 699 | lpfc_set_rrq_active(phba, ndlp, |
700 | psb->cur_iocbq.sli4_lxritag, rxid, 1); | ||
700 | lpfc_sli4_abts_err_handler(phba, ndlp, axri); | 701 | lpfc_sli4_abts_err_handler(phba, ndlp, axri); |
701 | } | 702 | } |
702 | lpfc_release_scsi_buf_s4(phba, psb); | 703 | lpfc_release_scsi_buf_s4(phba, psb); |
@@ -1099,7 +1100,7 @@ lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | |||
1099 | list_for_each_entry(lpfc_cmd, &phba->lpfc_scsi_buf_list, | 1100 | list_for_each_entry(lpfc_cmd, &phba->lpfc_scsi_buf_list, |
1100 | list) { | 1101 | list) { |
1101 | if (lpfc_test_rrq_active(phba, ndlp, | 1102 | if (lpfc_test_rrq_active(phba, ndlp, |
1102 | lpfc_cmd->cur_iocbq.sli4_xritag)) | 1103 | lpfc_cmd->cur_iocbq.sli4_lxritag)) |
1103 | continue; | 1104 | continue; |
1104 | list_del(&lpfc_cmd->list); | 1105 | list_del(&lpfc_cmd->list); |
1105 | found = 1; | 1106 | found = 1; |
@@ -3758,8 +3759,8 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, | |||
3758 | * ABTS we cannot generate and RRQ. | 3759 | * ABTS we cannot generate and RRQ. |
3759 | */ | 3760 | */ |
3760 | lpfc_set_rrq_active(phba, pnode, | 3761 | lpfc_set_rrq_active(phba, pnode, |
3761 | lpfc_cmd->cur_iocbq.sli4_xritag, | 3762 | lpfc_cmd->cur_iocbq.sli4_lxritag, |
3762 | 0, 0); | 3763 | 0, 0); |
3763 | } | 3764 | } |
3764 | /* else: fall through */ | 3765 | /* else: fall through */ |
3765 | default: | 3766 | default: |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index e84dd32553bc..70e4bc3a1a2d 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -885,7 +885,7 @@ __lpfc_sli_get_sglq(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq) | |||
885 | while (!found) { | 885 | while (!found) { |
886 | if (!sglq) | 886 | if (!sglq) |
887 | return NULL; | 887 | return NULL; |
888 | if (lpfc_test_rrq_active(phba, ndlp, sglq->sli4_xritag)) { | 888 | if (lpfc_test_rrq_active(phba, ndlp, sglq->sli4_lxritag)) { |
889 | /* This xri has an rrq outstanding for this DID. | 889 | /* This xri has an rrq outstanding for this DID. |
890 | * put it back in the list and get another xri. | 890 | * put it back in the list and get another xri. |
891 | */ | 891 | */ |
@@ -13953,7 +13953,6 @@ lpfc_sli4_xri_inrange(struct lpfc_hba *phba, | |||
13953 | return NO_XRI; | 13953 | return NO_XRI; |
13954 | } | 13954 | } |
13955 | 13955 | ||
13956 | |||
13957 | /** | 13956 | /** |
13958 | * lpfc_sli4_seq_abort_rsp - bls rsp to sequence abort | 13957 | * lpfc_sli4_seq_abort_rsp - bls rsp to sequence abort |
13959 | * @phba: Pointer to HBA context object. | 13958 | * @phba: Pointer to HBA context object. |
@@ -13968,7 +13967,7 @@ lpfc_sli4_seq_abort_rsp(struct lpfc_hba *phba, | |||
13968 | { | 13967 | { |
13969 | struct lpfc_iocbq *ctiocb = NULL; | 13968 | struct lpfc_iocbq *ctiocb = NULL; |
13970 | struct lpfc_nodelist *ndlp; | 13969 | struct lpfc_nodelist *ndlp; |
13971 | uint16_t oxid, rxid; | 13970 | uint16_t oxid, rxid, xri, lxri; |
13972 | uint32_t sid, fctl; | 13971 | uint32_t sid, fctl; |
13973 | IOCB_t *icmd; | 13972 | IOCB_t *icmd; |
13974 | int rc; | 13973 | int rc; |
@@ -13987,8 +13986,6 @@ lpfc_sli4_seq_abort_rsp(struct lpfc_hba *phba, | |||
13987 | "SID:x%x\n", oxid, sid); | 13986 | "SID:x%x\n", oxid, sid); |
13988 | return; | 13987 | return; |
13989 | } | 13988 | } |
13990 | if (lpfc_sli4_xri_inrange(phba, rxid)) | ||
13991 | lpfc_set_rrq_active(phba, ndlp, rxid, oxid, 0); | ||
13992 | 13989 | ||
13993 | /* Allocate buffer for rsp iocb */ | 13990 | /* Allocate buffer for rsp iocb */ |
13994 | ctiocb = lpfc_sli_get_iocbq(phba); | 13991 | ctiocb = lpfc_sli_get_iocbq(phba); |
@@ -14019,13 +14016,24 @@ lpfc_sli4_seq_abort_rsp(struct lpfc_hba *phba, | |||
14019 | ctiocb->sli4_lxritag = NO_XRI; | 14016 | ctiocb->sli4_lxritag = NO_XRI; |
14020 | ctiocb->sli4_xritag = NO_XRI; | 14017 | ctiocb->sli4_xritag = NO_XRI; |
14021 | 14018 | ||
14019 | if (fctl & FC_FC_EX_CTX) | ||
14020 | /* Exchange responder sent the abort so we | ||
14021 | * own the oxid. | ||
14022 | */ | ||
14023 | xri = oxid; | ||
14024 | else | ||
14025 | xri = rxid; | ||
14026 | lxri = lpfc_sli4_xri_inrange(phba, xri); | ||
14027 | if (lxri != NO_XRI) | ||
14028 | lpfc_set_rrq_active(phba, ndlp, lxri, | ||
14029 | (xri == oxid) ? rxid : oxid, 0); | ||
14022 | /* If the oxid maps to the FCP XRI range or if it is out of range, | 14030 | /* If the oxid maps to the FCP XRI range or if it is out of range, |
14023 | * send a BLS_RJT. The driver no longer has that exchange. | 14031 | * send a BLS_RJT. The driver no longer has that exchange. |
14024 | * Override the IOCB for a BA_RJT. | 14032 | * Override the IOCB for a BA_RJT. |
14025 | */ | 14033 | */ |
14026 | if (oxid > (phba->sli4_hba.max_cfg_param.max_xri + | 14034 | if (xri > (phba->sli4_hba.max_cfg_param.max_xri + |
14027 | phba->sli4_hba.max_cfg_param.xri_base) || | 14035 | phba->sli4_hba.max_cfg_param.xri_base) || |
14028 | oxid > (lpfc_sli4_get_els_iocb_cnt(phba) + | 14036 | xri > (lpfc_sli4_get_els_iocb_cnt(phba) + |
14029 | phba->sli4_hba.max_cfg_param.xri_base)) { | 14037 | phba->sli4_hba.max_cfg_param.xri_base)) { |
14030 | icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_BA_RJT; | 14038 | icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_BA_RJT; |
14031 | bf_set(lpfc_vndr_code, &icmd->un.bls_rsp, 0); | 14039 | bf_set(lpfc_vndr_code, &icmd->un.bls_rsp, 0); |