diff options
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_els.c | 11 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hw4.h | 6 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 30 |
4 files changed, 38 insertions, 11 deletions
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 0a8caa12a30d..bd7a72f6cdbe 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -5912,7 +5912,7 @@ lpfc_sg_seg_cnt_init(struct lpfc_hba *phba, int val) | |||
5912 | * 1 = MDS Diagnostics enabled | 5912 | * 1 = MDS Diagnostics enabled |
5913 | * Value range is [0,1]. Default value is 0. | 5913 | * Value range is [0,1]. Default value is 0. |
5914 | */ | 5914 | */ |
5915 | LPFC_ATTR_R(enable_mds_diags, 0, 0, 1, "Enable MDS Diagnostics"); | 5915 | LPFC_ATTR_RW(enable_mds_diags, 0, 0, 1, "Enable MDS Diagnostics"); |
5916 | 5916 | ||
5917 | /* | 5917 | /* |
5918 | * lpfc_ras_fwlog_buffsize: Firmware logging host buffer size | 5918 | * lpfc_ras_fwlog_buffsize: Firmware logging host buffer size |
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index aaad1c74bb98..30bbfa3f6086 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c | |||
@@ -1052,17 +1052,18 @@ stop_rr_fcf_flogi: | |||
1052 | if (lpfc_els_retry(phba, cmdiocb, rspiocb)) | 1052 | if (lpfc_els_retry(phba, cmdiocb, rspiocb)) |
1053 | goto out; | 1053 | goto out; |
1054 | 1054 | ||
1055 | lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS, | ||
1056 | "0150 FLOGI failure Status:x%x/x%x " | ||
1057 | "xri x%x TMO:x%x\n", | ||
1058 | irsp->ulpStatus, irsp->un.ulpWord[4], | ||
1059 | cmdiocb->sli4_xritag, irsp->ulpTimeout); | ||
1060 | |||
1055 | /* If this is not a loop open failure, bail out */ | 1061 | /* If this is not a loop open failure, bail out */ |
1056 | if (!(irsp->ulpStatus == IOSTAT_LOCAL_REJECT && | 1062 | if (!(irsp->ulpStatus == IOSTAT_LOCAL_REJECT && |
1057 | ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) == | 1063 | ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) == |
1058 | IOERR_LOOP_OPEN_FAILURE))) | 1064 | IOERR_LOOP_OPEN_FAILURE))) |
1059 | goto flogifail; | 1065 | goto flogifail; |
1060 | 1066 | ||
1061 | lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS, | ||
1062 | "0150 FLOGI failure Status:x%x/x%x xri x%x TMO:x%x\n", | ||
1063 | irsp->ulpStatus, irsp->un.ulpWord[4], | ||
1064 | cmdiocb->sli4_xritag, irsp->ulpTimeout); | ||
1065 | |||
1066 | /* FLOGI failed, so there is no fabric */ | 1067 | /* FLOGI failed, so there is no fabric */ |
1067 | spin_lock_irq(shost->host_lock); | 1068 | spin_lock_irq(shost->host_lock); |
1068 | vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); | 1069 | vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); |
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h index 77f9a55a3f54..d89480b9eade 100644 --- a/drivers/scsi/lpfc/lpfc_hw4.h +++ b/drivers/scsi/lpfc/lpfc_hw4.h | |||
@@ -4314,6 +4314,12 @@ struct wqe_common { | |||
4314 | #define wqe_rcvoxid_SHIFT 16 | 4314 | #define wqe_rcvoxid_SHIFT 16 |
4315 | #define wqe_rcvoxid_MASK 0x0000FFFF | 4315 | #define wqe_rcvoxid_MASK 0x0000FFFF |
4316 | #define wqe_rcvoxid_WORD word9 | 4316 | #define wqe_rcvoxid_WORD word9 |
4317 | #define wqe_sof_SHIFT 24 | ||
4318 | #define wqe_sof_MASK 0x000000FF | ||
4319 | #define wqe_sof_WORD word9 | ||
4320 | #define wqe_eof_SHIFT 16 | ||
4321 | #define wqe_eof_MASK 0x000000FF | ||
4322 | #define wqe_eof_WORD word9 | ||
4317 | uint32_t word10; | 4323 | uint32_t word10; |
4318 | #define wqe_ebde_cnt_SHIFT 0 | 4324 | #define wqe_ebde_cnt_SHIFT 0 |
4319 | #define wqe_ebde_cnt_MASK 0x0000000f | 4325 | #define wqe_ebde_cnt_MASK 0x0000000f |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 03404dbd6ddf..940dd82a265b 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -9352,11 +9352,9 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq, | |||
9352 | memset(wqe, 0, sizeof(union lpfc_wqe128)); | 9352 | memset(wqe, 0, sizeof(union lpfc_wqe128)); |
9353 | /* Some of the fields are in the right position already */ | 9353 | /* Some of the fields are in the right position already */ |
9354 | memcpy(wqe, &iocbq->iocb, sizeof(union lpfc_wqe)); | 9354 | memcpy(wqe, &iocbq->iocb, sizeof(union lpfc_wqe)); |
9355 | if (iocbq->iocb.ulpCommand != CMD_SEND_FRAME) { | 9355 | /* The ct field has moved so reset */ |
9356 | /* The ct field has moved so reset */ | 9356 | wqe->generic.wqe_com.word7 = 0; |
9357 | wqe->generic.wqe_com.word7 = 0; | 9357 | wqe->generic.wqe_com.word10 = 0; |
9358 | wqe->generic.wqe_com.word10 = 0; | ||
9359 | } | ||
9360 | 9358 | ||
9361 | abort_tag = (uint32_t) iocbq->iotag; | 9359 | abort_tag = (uint32_t) iocbq->iotag; |
9362 | xritag = iocbq->sli4_xritag; | 9360 | xritag = iocbq->sli4_xritag; |
@@ -9862,6 +9860,15 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq, | |||
9862 | 9860 | ||
9863 | break; | 9861 | break; |
9864 | case CMD_SEND_FRAME: | 9862 | case CMD_SEND_FRAME: |
9863 | bf_set(wqe_cmnd, &wqe->generic.wqe_com, CMD_SEND_FRAME); | ||
9864 | bf_set(wqe_sof, &wqe->generic.wqe_com, 0x2E); /* SOF byte */ | ||
9865 | bf_set(wqe_eof, &wqe->generic.wqe_com, 0x41); /* EOF byte */ | ||
9866 | bf_set(wqe_lenloc, &wqe->generic.wqe_com, 1); | ||
9867 | bf_set(wqe_xbl, &wqe->generic.wqe_com, 1); | ||
9868 | bf_set(wqe_dbde, &wqe->generic.wqe_com, 1); | ||
9869 | bf_set(wqe_xc, &wqe->generic.wqe_com, 1); | ||
9870 | bf_set(wqe_cmd_type, &wqe->generic.wqe_com, 0xA); | ||
9871 | bf_set(wqe_cqid, &wqe->generic.wqe_com, LPFC_WQE_CQ_ID_DEFAULT); | ||
9865 | bf_set(wqe_xri_tag, &wqe->generic.wqe_com, xritag); | 9872 | bf_set(wqe_xri_tag, &wqe->generic.wqe_com, xritag); |
9866 | bf_set(wqe_reqtag, &wqe->generic.wqe_com, iocbq->iotag); | 9873 | bf_set(wqe_reqtag, &wqe->generic.wqe_com, iocbq->iotag); |
9867 | return 0; | 9874 | return 0; |
@@ -16940,6 +16947,8 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr) | |||
16940 | struct fc_vft_header *fc_vft_hdr; | 16947 | struct fc_vft_header *fc_vft_hdr; |
16941 | uint32_t *header = (uint32_t *) fc_hdr; | 16948 | uint32_t *header = (uint32_t *) fc_hdr; |
16942 | 16949 | ||
16950 | #define FC_RCTL_MDS_DIAGS 0xF4 | ||
16951 | |||
16943 | switch (fc_hdr->fh_r_ctl) { | 16952 | switch (fc_hdr->fh_r_ctl) { |
16944 | case FC_RCTL_DD_UNCAT: /* uncategorized information */ | 16953 | case FC_RCTL_DD_UNCAT: /* uncategorized information */ |
16945 | case FC_RCTL_DD_SOL_DATA: /* solicited data */ | 16954 | case FC_RCTL_DD_SOL_DATA: /* solicited data */ |
@@ -17949,6 +17958,17 @@ lpfc_sli4_handle_received_buffer(struct lpfc_hba *phba, | |||
17949 | fcfi = bf_get(lpfc_rcqe_fcf_id, | 17958 | fcfi = bf_get(lpfc_rcqe_fcf_id, |
17950 | &dmabuf->cq_event.cqe.rcqe_cmpl); | 17959 | &dmabuf->cq_event.cqe.rcqe_cmpl); |
17951 | 17960 | ||
17961 | if (fc_hdr->fh_r_ctl == 0xF4 && fc_hdr->fh_type == 0xFF) { | ||
17962 | vport = phba->pport; | ||
17963 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, | ||
17964 | "2023 MDS Loopback %d bytes\n", | ||
17965 | bf_get(lpfc_rcqe_length, | ||
17966 | &dmabuf->cq_event.cqe.rcqe_cmpl)); | ||
17967 | /* Handle MDS Loopback frames */ | ||
17968 | lpfc_sli4_handle_mds_loopback(vport, dmabuf); | ||
17969 | return; | ||
17970 | } | ||
17971 | |||
17952 | /* d_id this frame is directed to */ | 17972 | /* d_id this frame is directed to */ |
17953 | did = sli4_did_from_fc_hdr(fc_hdr); | 17973 | did = sli4_did_from_fc_hdr(fc_hdr); |
17954 | 17974 | ||