diff options
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 10 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_els.c | 66 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 12 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 6 |
6 files changed, 61 insertions, 35 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index b7193d1a90f6..da8b6bb09a76 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -247,6 +247,9 @@ struct lpfc_hba { | |||
247 | #define FC_ABORT_DISCOVERY 0x8000 /* we want to abort discovery */ | 247 | #define FC_ABORT_DISCOVERY 0x8000 /* we want to abort discovery */ |
248 | #define FC_NDISC_ACTIVE 0x10000 /* NPort discovery active */ | 248 | #define FC_NDISC_ACTIVE 0x10000 /* NPort discovery active */ |
249 | #define FC_BYPASSED_MODE 0x20000 /* NPort is in bypassed mode */ | 249 | #define FC_BYPASSED_MODE 0x20000 /* NPort is in bypassed mode */ |
250 | #define FC_LOOPBACK_MODE 0x40000 /* NPort is in Loopback mode */ | ||
251 | /* This flag is set while issuing */ | ||
252 | /* INIT_LINK mailbox command */ | ||
250 | 253 | ||
251 | uint32_t fc_topology; /* link topology, from LINK INIT */ | 254 | uint32_t fc_topology; /* link topology, from LINK INIT */ |
252 | 255 | ||
@@ -388,6 +391,13 @@ struct lpfc_hba { | |||
388 | struct fc_host_statistics link_stats; | 391 | struct fc_host_statistics link_stats; |
389 | }; | 392 | }; |
390 | 393 | ||
394 | static inline void | ||
395 | lpfc_set_loopback_flag(struct lpfc_hba *phba) { | ||
396 | if (phba->cfg_topology == FLAGS_LOCAL_LB) | ||
397 | phba->fc_flag |= FC_LOOPBACK_MODE; | ||
398 | else | ||
399 | phba->fc_flag &= ~FC_LOOPBACK_MODE; | ||
400 | } | ||
391 | 401 | ||
392 | struct rnidrsp { | 402 | struct rnidrsp { |
393 | void *buf; | 403 | void *buf; |
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 7811aaf114d5..df9847ea1a12 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -237,6 +237,7 @@ lpfc_issue_lip(struct Scsi_Host *host) | |||
237 | phba->fc_ratov * 2); | 237 | phba->fc_ratov * 2); |
238 | } | 238 | } |
239 | 239 | ||
240 | lpfc_set_loopback_flag(phba); | ||
240 | if (mbxstatus == MBX_TIMEOUT) | 241 | if (mbxstatus == MBX_TIMEOUT) |
241 | pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; | 242 | pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; |
242 | else | 243 | else |
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 4d9e7f50c189..8f98c5b0bf8c 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c | |||
@@ -2046,10 +2046,9 @@ lpfc_els_rsp_reject(struct lpfc_hba * phba, uint32_t rejectError, | |||
2046 | 2046 | ||
2047 | /* Xmit ELS RJT <err> response tag <ulpIoTag> */ | 2047 | /* Xmit ELS RJT <err> response tag <ulpIoTag> */ |
2048 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | 2048 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, |
2049 | "%d:0129 Xmit ELS RJT x%x response tag x%x " | 2049 | "%d:0129 Xmit ELS RJT x%x response tag x%x xri x%x, " |
2050 | "Data: x%x x%x x%x x%x x%x\n", | 2050 | "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n", |
2051 | phba->brd_no, | 2051 | phba->brd_no, rejectError, elsiocb->iotag, |
2052 | rejectError, elsiocb->iocb.ulpIoTag, | ||
2053 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, | 2052 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, |
2054 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); | 2053 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); |
2055 | 2054 | ||
@@ -2088,18 +2087,18 @@ lpfc_els_rsp_adisc_acc(struct lpfc_hba * phba, | |||
2088 | if (!elsiocb) | 2087 | if (!elsiocb) |
2089 | return 1; | 2088 | return 1; |
2090 | 2089 | ||
2090 | icmd = &elsiocb->iocb; | ||
2091 | oldcmd = &oldiocb->iocb; | ||
2092 | icmd->ulpContext = oldcmd->ulpContext; /* Xri */ | ||
2093 | |||
2091 | /* Xmit ADISC ACC response tag <ulpIoTag> */ | 2094 | /* Xmit ADISC ACC response tag <ulpIoTag> */ |
2092 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | 2095 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, |
2093 | "%d:0130 Xmit ADISC ACC response tag x%x " | 2096 | "%d:0130 Xmit ADISC ACC response iotag x%x xri: " |
2094 | "Data: x%x x%x x%x x%x x%x\n", | 2097 | "x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n", |
2095 | phba->brd_no, | 2098 | phba->brd_no, elsiocb->iotag, |
2096 | elsiocb->iocb.ulpIoTag, | ||
2097 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, | 2099 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, |
2098 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); | 2100 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); |
2099 | 2101 | ||
2100 | icmd = &elsiocb->iocb; | ||
2101 | oldcmd = &oldiocb->iocb; | ||
2102 | icmd->ulpContext = oldcmd->ulpContext; /* Xri */ | ||
2103 | pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); | 2102 | pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); |
2104 | 2103 | ||
2105 | *((uint32_t *) (pcmd)) = ELS_CMD_ACC; | 2104 | *((uint32_t *) (pcmd)) = ELS_CMD_ACC; |
@@ -2124,8 +2123,8 @@ lpfc_els_rsp_adisc_acc(struct lpfc_hba * phba, | |||
2124 | } | 2123 | } |
2125 | 2124 | ||
2126 | int | 2125 | int |
2127 | lpfc_els_rsp_prli_acc(struct lpfc_hba * phba, | 2126 | lpfc_els_rsp_prli_acc(struct lpfc_hba *phba, struct lpfc_iocbq *oldiocb, |
2128 | struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp) | 2127 | struct lpfc_nodelist *ndlp) |
2129 | { | 2128 | { |
2130 | PRLI *npr; | 2129 | PRLI *npr; |
2131 | lpfc_vpd_t *vpd; | 2130 | lpfc_vpd_t *vpd; |
@@ -2147,18 +2146,18 @@ lpfc_els_rsp_prli_acc(struct lpfc_hba * phba, | |||
2147 | if (!elsiocb) | 2146 | if (!elsiocb) |
2148 | return 1; | 2147 | return 1; |
2149 | 2148 | ||
2149 | icmd = &elsiocb->iocb; | ||
2150 | oldcmd = &oldiocb->iocb; | ||
2151 | icmd->ulpContext = oldcmd->ulpContext; /* Xri */ | ||
2152 | |||
2150 | /* Xmit PRLI ACC response tag <ulpIoTag> */ | 2153 | /* Xmit PRLI ACC response tag <ulpIoTag> */ |
2151 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | 2154 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, |
2152 | "%d:0131 Xmit PRLI ACC response tag x%x " | 2155 | "%d:0131 Xmit PRLI ACC response tag x%x xri x%x, " |
2153 | "Data: x%x x%x x%x x%x x%x\n", | 2156 | "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n", |
2154 | phba->brd_no, | 2157 | phba->brd_no, elsiocb->iotag, |
2155 | elsiocb->iocb.ulpIoTag, | ||
2156 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, | 2158 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, |
2157 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); | 2159 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); |
2158 | 2160 | ||
2159 | icmd = &elsiocb->iocb; | ||
2160 | oldcmd = &oldiocb->iocb; | ||
2161 | icmd->ulpContext = oldcmd->ulpContext; /* Xri */ | ||
2162 | pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); | 2161 | pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); |
2163 | 2162 | ||
2164 | *((uint32_t *) (pcmd)) = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK)); | 2163 | *((uint32_t *) (pcmd)) = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK)); |
@@ -2228,17 +2227,17 @@ lpfc_els_rsp_rnid_acc(struct lpfc_hba * phba, | |||
2228 | if (!elsiocb) | 2227 | if (!elsiocb) |
2229 | return 1; | 2228 | return 1; |
2230 | 2229 | ||
2230 | icmd = &elsiocb->iocb; | ||
2231 | oldcmd = &oldiocb->iocb; | ||
2232 | icmd->ulpContext = oldcmd->ulpContext; /* Xri */ | ||
2233 | |||
2231 | /* Xmit RNID ACC response tag <ulpIoTag> */ | 2234 | /* Xmit RNID ACC response tag <ulpIoTag> */ |
2232 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | 2235 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, |
2233 | "%d:0132 Xmit RNID ACC response tag x%x " | 2236 | "%d:0132 Xmit RNID ACC response tag x%x " |
2234 | "Data: x%x\n", | 2237 | "xri x%x\n", |
2235 | phba->brd_no, | 2238 | phba->brd_no, elsiocb->iotag, |
2236 | elsiocb->iocb.ulpIoTag, | ||
2237 | elsiocb->iocb.ulpContext); | 2239 | elsiocb->iocb.ulpContext); |
2238 | 2240 | ||
2239 | icmd = &elsiocb->iocb; | ||
2240 | oldcmd = &oldiocb->iocb; | ||
2241 | icmd->ulpContext = oldcmd->ulpContext; /* Xri */ | ||
2242 | pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); | 2241 | pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); |
2243 | 2242 | ||
2244 | *((uint32_t *) (pcmd)) = ELS_CMD_ACC; | 2243 | *((uint32_t *) (pcmd)) = ELS_CMD_ACC; |
@@ -2701,6 +2700,7 @@ lpfc_els_rcv_flogi(struct lpfc_hba * phba, | |||
2701 | mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; | 2700 | mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; |
2702 | rc = lpfc_sli_issue_mbox | 2701 | rc = lpfc_sli_issue_mbox |
2703 | (phba, mbox, (MBX_NOWAIT | MBX_STOP_IOCB)); | 2702 | (phba, mbox, (MBX_NOWAIT | MBX_STOP_IOCB)); |
2703 | lpfc_set_loopback_flag(phba); | ||
2704 | if (rc == MBX_NOT_FINISHED) { | 2704 | if (rc == MBX_NOT_FINISHED) { |
2705 | mempool_free( mbox, phba->mbox_mem_pool); | 2705 | mempool_free( mbox, phba->mbox_mem_pool); |
2706 | } | 2706 | } |
@@ -2842,10 +2842,9 @@ lpfc_els_rsp_rps_acc(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | |||
2842 | 2842 | ||
2843 | /* Xmit ELS RPS ACC response tag <ulpIoTag> */ | 2843 | /* Xmit ELS RPS ACC response tag <ulpIoTag> */ |
2844 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | 2844 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, |
2845 | "%d:0118 Xmit ELS RPS ACC response tag x%x " | 2845 | "%d:0118 Xmit ELS RPS ACC response tag x%x xri x%x, " |
2846 | "Data: x%x x%x x%x x%x x%x\n", | 2846 | "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n", |
2847 | phba->brd_no, | 2847 | phba->brd_no, elsiocb->iotag, |
2848 | elsiocb->iocb.ulpIoTag, | ||
2849 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, | 2848 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, |
2850 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); | 2849 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); |
2851 | 2850 | ||
@@ -2951,10 +2950,9 @@ lpfc_els_rsp_rpl_acc(struct lpfc_hba * phba, uint16_t cmdsize, | |||
2951 | 2950 | ||
2952 | /* Xmit ELS RPL ACC response tag <ulpIoTag> */ | 2951 | /* Xmit ELS RPL ACC response tag <ulpIoTag> */ |
2953 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | 2952 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, |
2954 | "%d:0120 Xmit ELS RPL ACC response tag x%x " | 2953 | "%d:0120 Xmit ELS RPL ACC response tag x%x xri x%x, " |
2955 | "Data: x%x x%x x%x x%x x%x\n", | 2954 | "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n", |
2956 | phba->brd_no, | 2955 | phba->brd_no, elsiocb->iotag, |
2957 | elsiocb->iocb.ulpIoTag, | ||
2958 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, | 2956 | elsiocb->iocb.ulpContext, ndlp->nlp_DID, |
2959 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); | 2957 | ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); |
2960 | 2958 | ||
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 5f8698bcecb9..164af8a7e95d 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -900,12 +900,21 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | |||
900 | 900 | ||
901 | if (la->attType == AT_LINK_UP) { | 901 | if (la->attType == AT_LINK_UP) { |
902 | phba->fc_stat.LinkUp++; | 902 | phba->fc_stat.LinkUp++; |
903 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, | 903 | if (phba->fc_flag & FC_LOOPBACK_MODE) { |
904 | lpfc_printf_log(phba, KERN_INFO, LOG_LINK_EVENT, | ||
905 | "%d:1306 Link Up Event in loop back mode " | ||
906 | "x%x received Data: x%x x%x x%x x%x\n", | ||
907 | phba->brd_no, la->eventTag, phba->fc_eventTag, | ||
908 | la->granted_AL_PA, la->UlnkSpeed, | ||
909 | phba->alpa_map[0]); | ||
910 | } else { | ||
911 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, | ||
904 | "%d:1303 Link Up Event x%x received " | 912 | "%d:1303 Link Up Event x%x received " |
905 | "Data: x%x x%x x%x x%x\n", | 913 | "Data: x%x x%x x%x x%x\n", |
906 | phba->brd_no, la->eventTag, phba->fc_eventTag, | 914 | phba->brd_no, la->eventTag, phba->fc_eventTag, |
907 | la->granted_AL_PA, la->UlnkSpeed, | 915 | la->granted_AL_PA, la->UlnkSpeed, |
908 | phba->alpa_map[0]); | 916 | phba->alpa_map[0]); |
917 | } | ||
909 | lpfc_mbx_process_link_up(phba, la); | 918 | lpfc_mbx_process_link_up(phba, la); |
910 | } else { | 919 | } else { |
911 | phba->fc_stat.LinkDown++; | 920 | phba->fc_stat.LinkDown++; |
@@ -2251,6 +2260,7 @@ lpfc_disc_timeout_handler(struct lpfc_hba *phba) | |||
2251 | initlinkmbox->mb.un.varInitLnk.lipsr_AL_PA = 0; | 2260 | initlinkmbox->mb.un.varInitLnk.lipsr_AL_PA = 0; |
2252 | rc = lpfc_sli_issue_mbox(phba, initlinkmbox, | 2261 | rc = lpfc_sli_issue_mbox(phba, initlinkmbox, |
2253 | (MBX_NOWAIT | MBX_STOP_IOCB)); | 2262 | (MBX_NOWAIT | MBX_STOP_IOCB)); |
2263 | lpfc_set_loopback_flag(phba); | ||
2254 | if (rc == MBX_NOT_FINISHED) | 2264 | if (rc == MBX_NOT_FINISHED) |
2255 | mempool_free(initlinkmbox, phba->mbox_mem_pool); | 2265 | mempool_free(initlinkmbox, phba->mbox_mem_pool); |
2256 | 2266 | ||
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 6449ac8fca24..4df0a77ab12e 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -391,6 +391,7 @@ lpfc_config_port_post(struct lpfc_hba * phba) | |||
391 | lpfc_init_link(phba, pmb, phba->cfg_topology, phba->cfg_link_speed); | 391 | lpfc_init_link(phba, pmb, phba->cfg_topology, phba->cfg_link_speed); |
392 | pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; | 392 | pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; |
393 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT); | 393 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT); |
394 | lpfc_set_loopback_flag(phba); | ||
394 | if (rc != MBX_SUCCESS) { | 395 | if (rc != MBX_SUCCESS) { |
395 | lpfc_printf_log(phba, | 396 | lpfc_printf_log(phba, |
396 | KERN_ERR, | 397 | KERN_ERR, |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index dba94c68feb1..fd82797df095 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -2794,6 +2794,12 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba * phba, | |||
2794 | iabt->ulpCommand = CMD_CLOSE_XRI_CN; | 2794 | iabt->ulpCommand = CMD_CLOSE_XRI_CN; |
2795 | 2795 | ||
2796 | abtsiocbp->iocb_cmpl = lpfc_sli_abort_els_cmpl; | 2796 | abtsiocbp->iocb_cmpl = lpfc_sli_abort_els_cmpl; |
2797 | |||
2798 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, | ||
2799 | "%d:0339 Abort xri x%x, original iotag x%x, abort " | ||
2800 | "cmd iotag x%x\n", | ||
2801 | phba->brd_no, iabt->un.acxri.abortContextTag, | ||
2802 | iabt->un.acxri.abortIoTag, abtsiocbp->iotag); | ||
2797 | retval = lpfc_sli_issue_iocb(phba, pring, abtsiocbp, 0); | 2803 | retval = lpfc_sli_issue_iocb(phba, pring, abtsiocbp, 0); |
2798 | 2804 | ||
2799 | abort_iotag_exit: | 2805 | abort_iotag_exit: |