diff options
author | James Smart <james.smart@emulex.com> | 2011-05-24 11:40:48 -0400 |
---|---|---|
committer | James Bottomley <jbottomley@parallels.com> | 2011-05-26 23:49:35 -0400 |
commit | 0558056c1ecd177f2621fc2a0484d565270f7ae1 (patch) | |
tree | c29b0ac1ddd56b94f15f6edf8c62bdddf6ae851e /drivers/scsi | |
parent | 1ca1e43e55f4cd068f997154ffaf5fa62b08b802 (diff) |
[SCSI] lpfc 8.3.24: Miscellaneous Fixes and Corrections
Miscellaneous Fixes and Corrections
- Remove the memset in the lpfc_sli4_remove_rpi_hdrs call.
- Correct swapping of SGE word 2 relative to offset value
- Reorganize CQ and EQ usage to comply with SLI4 Specification.
- Expand the driver to check the rn bit. Only detect an error if the error bit
is set and the RN bit is NOT set.
- If mailbox completion code is not success AND the mailbox status is success,
then and only then will the driver overwrite the mailbox status.
- When driver initializing device, if the device is on a PCIe bus, set
PCI's "needs fundamental reset" bit so that EEH uses fundamental reset
instead of hot reset for recovery.
- Prevent driver from using new WWN when changed in firmware (until driver
reload)
- When HBA reports maximum SGE size > 0xffffffff (infinite), override
with 0x80000000.
- Fixed potential missed SLI4 device initialization failure conditions.
- Added 100ms delay before driver action following IF_TYPE_2 function reset.
- Reverted patch to UNREG/REG on PLOGI to mapped/unmapped node.
- Add a check for the CVL received flag in the fcf inuse routine to avoid
unregistering the fcf if Devloss fires before Delay discover timer fires.
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')
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_crtn.h | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_debugfs.c | 10 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 22 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hw4.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 146 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_nportdisc.c | 11 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 3 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 46 |
9 files changed, 169 insertions, 73 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 02d53d89534f..3df2b39dd87a 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -41,6 +41,7 @@ struct lpfc_sli2_slim; | |||
41 | downloads using bsg */ | 41 | downloads using bsg */ |
42 | #define LPFC_DEFAULT_PROT_SG_SEG_CNT 4096 /* sg protection elements count */ | 42 | #define LPFC_DEFAULT_PROT_SG_SEG_CNT 4096 /* sg protection elements count */ |
43 | #define LPFC_MAX_SG_SEG_CNT 4096 /* sg element count per scsi cmnd */ | 43 | #define LPFC_MAX_SG_SEG_CNT 4096 /* sg element count per scsi cmnd */ |
44 | #define LPFC_MAX_SGE_SIZE 0x80000000 /* Maximum data allowed in a SGE */ | ||
44 | #define LPFC_MAX_PROT_SG_SEG_CNT 4096 /* prot sg element count per scsi cmd*/ | 45 | #define LPFC_MAX_PROT_SG_SEG_CNT 4096 /* prot sg element count per scsi cmd*/ |
45 | #define LPFC_IOCB_LIST_CNT 2250 /* list of IOCBs for fast-path usage. */ | 46 | #define LPFC_IOCB_LIST_CNT 2250 /* list of IOCBs for fast-path usage. */ |
46 | #define LPFC_Q_RAMP_UP_INTERVAL 120 /* lun q_depth ramp up interval */ | 47 | #define LPFC_Q_RAMP_UP_INTERVAL 120 /* lun q_depth ramp up interval */ |
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index f0b332f4eedb..eb02016a21b5 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h | |||
@@ -171,6 +171,7 @@ void lpfc_delayed_disc_tmo(unsigned long); | |||
171 | void lpfc_delayed_disc_timeout_handler(struct lpfc_vport *); | 171 | void lpfc_delayed_disc_timeout_handler(struct lpfc_vport *); |
172 | 172 | ||
173 | int lpfc_config_port_prep(struct lpfc_hba *); | 173 | int lpfc_config_port_prep(struct lpfc_hba *); |
174 | void lpfc_update_vport_wwn(struct lpfc_vport *vport); | ||
174 | int lpfc_config_port_post(struct lpfc_hba *); | 175 | int lpfc_config_port_post(struct lpfc_hba *); |
175 | int lpfc_hba_down_prep(struct lpfc_hba *); | 176 | int lpfc_hba_down_prep(struct lpfc_hba *); |
176 | int lpfc_hba_down_post(struct lpfc_hba *); | 177 | int lpfc_hba_down_post(struct lpfc_hba *); |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index c93fca058603..ffe82d169b40 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
@@ -1665,7 +1665,8 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
1665 | /* Get fast-path complete queue information */ | 1665 | /* Get fast-path complete queue information */ |
1666 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 1666 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
1667 | "Fast-path FCP CQ information:\n"); | 1667 | "Fast-path FCP CQ information:\n"); |
1668 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; fcp_qidx++) { | 1668 | fcp_qidx = 0; |
1669 | do { | ||
1669 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 1670 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
1670 | "Associated EQID[%02d]:\n", | 1671 | "Associated EQID[%02d]:\n", |
1671 | phba->sli4_hba.fcp_cq[fcp_qidx]->assoc_qid); | 1672 | phba->sli4_hba.fcp_cq[fcp_qidx]->assoc_qid); |
@@ -1678,7 +1679,7 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
1678 | phba->sli4_hba.fcp_cq[fcp_qidx]->entry_size, | 1679 | phba->sli4_hba.fcp_cq[fcp_qidx]->entry_size, |
1679 | phba->sli4_hba.fcp_cq[fcp_qidx]->host_index, | 1680 | phba->sli4_hba.fcp_cq[fcp_qidx]->host_index, |
1680 | phba->sli4_hba.fcp_cq[fcp_qidx]->hba_index); | 1681 | phba->sli4_hba.fcp_cq[fcp_qidx]->hba_index); |
1681 | } | 1682 | } while (++fcp_qidx < phba->cfg_fcp_eq_count); |
1682 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n"); | 1683 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n"); |
1683 | 1684 | ||
1684 | /* Get mailbox queue information */ | 1685 | /* Get mailbox queue information */ |
@@ -2012,7 +2013,8 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
2012 | goto pass_check; | 2013 | goto pass_check; |
2013 | } | 2014 | } |
2014 | /* FCP complete queue */ | 2015 | /* FCP complete queue */ |
2015 | for (qidx = 0; qidx < phba->cfg_fcp_eq_count; qidx++) { | 2016 | qidx = 0; |
2017 | do { | ||
2016 | if (phba->sli4_hba.fcp_cq[qidx]->queue_id == queid) { | 2018 | if (phba->sli4_hba.fcp_cq[qidx]->queue_id == queid) { |
2017 | /* Sanity check */ | 2019 | /* Sanity check */ |
2018 | rc = lpfc_idiag_que_param_check( | 2020 | rc = lpfc_idiag_que_param_check( |
@@ -2024,7 +2026,7 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
2024 | phba->sli4_hba.fcp_cq[qidx]; | 2026 | phba->sli4_hba.fcp_cq[qidx]; |
2025 | goto pass_check; | 2027 | goto pass_check; |
2026 | } | 2028 | } |
2027 | } | 2029 | } while (++qidx < phba->cfg_fcp_eq_count); |
2028 | goto error_out; | 2030 | goto error_out; |
2029 | break; | 2031 | break; |
2030 | case LPFC_IDIAG_MQ: | 2032 | case LPFC_IDIAG_MQ: |
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 7a35df5e2038..2653c844d20d 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -2690,16 +2690,7 @@ lpfc_mbx_cmpl_read_sparam(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
2690 | 2690 | ||
2691 | memcpy((uint8_t *) &vport->fc_sparam, (uint8_t *) mp->virt, | 2691 | memcpy((uint8_t *) &vport->fc_sparam, (uint8_t *) mp->virt, |
2692 | sizeof (struct serv_parm)); | 2692 | sizeof (struct serv_parm)); |
2693 | if (phba->cfg_soft_wwnn) | 2693 | lpfc_update_vport_wwn(vport); |
2694 | u64_to_wwn(phba->cfg_soft_wwnn, | ||
2695 | vport->fc_sparam.nodeName.u.wwn); | ||
2696 | if (phba->cfg_soft_wwpn) | ||
2697 | u64_to_wwn(phba->cfg_soft_wwpn, | ||
2698 | vport->fc_sparam.portName.u.wwn); | ||
2699 | memcpy(&vport->fc_nodename, &vport->fc_sparam.nodeName, | ||
2700 | sizeof(vport->fc_nodename)); | ||
2701 | memcpy(&vport->fc_portname, &vport->fc_sparam.portName, | ||
2702 | sizeof(vport->fc_portname)); | ||
2703 | if (vport->port_type == LPFC_PHYSICAL_PORT) { | 2694 | if (vport->port_type == LPFC_PHYSICAL_PORT) { |
2704 | memcpy(&phba->wwnn, &vport->fc_nodename, sizeof(phba->wwnn)); | 2695 | memcpy(&phba->wwnn, &vport->fc_nodename, sizeof(phba->wwnn)); |
2705 | memcpy(&phba->wwpn, &vport->fc_portname, sizeof(phba->wwnn)); | 2696 | memcpy(&phba->wwpn, &vport->fc_portname, sizeof(phba->wwnn)); |
@@ -5354,6 +5345,17 @@ lpfc_fcf_inuse(struct lpfc_hba *phba) | |||
5354 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { | 5345 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { |
5355 | shost = lpfc_shost_from_vport(vports[i]); | 5346 | shost = lpfc_shost_from_vport(vports[i]); |
5356 | spin_lock_irq(shost->host_lock); | 5347 | spin_lock_irq(shost->host_lock); |
5348 | /* | ||
5349 | * IF the CVL_RCVD bit is not set then we have sent the | ||
5350 | * flogi. | ||
5351 | * If dev_loss fires while we are waiting we do not want to | ||
5352 | * unreg the fcf. | ||
5353 | */ | ||
5354 | if (!(vports[i]->fc_flag & FC_VPORT_CVL_RCVD)) { | ||
5355 | spin_unlock_irq(shost->host_lock); | ||
5356 | ret = 1; | ||
5357 | goto out; | ||
5358 | } | ||
5357 | list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { | 5359 | list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { |
5358 | if (NLP_CHK_NODE_ACT(ndlp) && ndlp->rport && | 5360 | if (NLP_CHK_NODE_ACT(ndlp) && ndlp->rport && |
5359 | (ndlp->rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { | 5361 | (ndlp->rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { |
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h index 4dff668ebdad..2e75f3df04fd 100644 --- a/drivers/scsi/lpfc/lpfc_hw4.h +++ b/drivers/scsi/lpfc/lpfc_hw4.h | |||
@@ -1229,7 +1229,7 @@ struct sli4_sge { /* SLI-4 */ | |||
1229 | 1229 | ||
1230 | uint32_t word2; | 1230 | uint32_t word2; |
1231 | #define lpfc_sli4_sge_offset_SHIFT 0 /* Offset of buffer - Not used*/ | 1231 | #define lpfc_sli4_sge_offset_SHIFT 0 /* Offset of buffer - Not used*/ |
1232 | #define lpfc_sli4_sge_offset_MASK 0x00FFFFFF | 1232 | #define lpfc_sli4_sge_offset_MASK 0x1FFFFFFF |
1233 | #define lpfc_sli4_sge_offset_WORD word2 | 1233 | #define lpfc_sli4_sge_offset_WORD word2 |
1234 | #define lpfc_sli4_sge_last_SHIFT 31 /* Last SEG in the SGL sets | 1234 | #define lpfc_sli4_sge_last_SHIFT 31 /* Last SEG in the SGL sets |
1235 | this flag !! */ | 1235 | this flag !! */ |
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 7dda036a1af3..f297f9d027dc 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -309,6 +309,45 @@ lpfc_dump_wakeup_param_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) | |||
309 | } | 309 | } |
310 | 310 | ||
311 | /** | 311 | /** |
312 | * lpfc_update_vport_wwn - Updates the fc_nodename, fc_portname, | ||
313 | * cfg_soft_wwnn, cfg_soft_wwpn | ||
314 | * @vport: pointer to lpfc vport data structure. | ||
315 | * | ||
316 | * | ||
317 | * Return codes | ||
318 | * None. | ||
319 | **/ | ||
320 | void | ||
321 | lpfc_update_vport_wwn(struct lpfc_vport *vport) | ||
322 | { | ||
323 | /* If the soft name exists then update it using the service params */ | ||
324 | if (vport->phba->cfg_soft_wwnn) | ||
325 | u64_to_wwn(vport->phba->cfg_soft_wwnn, | ||
326 | vport->fc_sparam.nodeName.u.wwn); | ||
327 | if (vport->phba->cfg_soft_wwpn) | ||
328 | u64_to_wwn(vport->phba->cfg_soft_wwpn, | ||
329 | vport->fc_sparam.portName.u.wwn); | ||
330 | |||
331 | /* | ||
332 | * If the name is empty or there exists a soft name | ||
333 | * then copy the service params name, otherwise use the fc name | ||
334 | */ | ||
335 | if (vport->fc_nodename.u.wwn[0] == 0 || vport->phba->cfg_soft_wwnn) | ||
336 | memcpy(&vport->fc_nodename, &vport->fc_sparam.nodeName, | ||
337 | sizeof(struct lpfc_name)); | ||
338 | else | ||
339 | memcpy(&vport->fc_sparam.nodeName, &vport->fc_nodename, | ||
340 | sizeof(struct lpfc_name)); | ||
341 | |||
342 | if (vport->fc_portname.u.wwn[0] == 0 || vport->phba->cfg_soft_wwpn) | ||
343 | memcpy(&vport->fc_portname, &vport->fc_sparam.portName, | ||
344 | sizeof(struct lpfc_name)); | ||
345 | else | ||
346 | memcpy(&vport->fc_sparam.portName, &vport->fc_portname, | ||
347 | sizeof(struct lpfc_name)); | ||
348 | } | ||
349 | |||
350 | /** | ||
312 | * lpfc_config_port_post - Perform lpfc initialization after config port | 351 | * lpfc_config_port_post - Perform lpfc initialization after config port |
313 | * @phba: pointer to lpfc hba data structure. | 352 | * @phba: pointer to lpfc hba data structure. |
314 | * | 353 | * |
@@ -377,17 +416,7 @@ lpfc_config_port_post(struct lpfc_hba *phba) | |||
377 | lpfc_mbuf_free(phba, mp->virt, mp->phys); | 416 | lpfc_mbuf_free(phba, mp->virt, mp->phys); |
378 | kfree(mp); | 417 | kfree(mp); |
379 | pmb->context1 = NULL; | 418 | pmb->context1 = NULL; |
380 | 419 | lpfc_update_vport_wwn(vport); | |
381 | if (phba->cfg_soft_wwnn) | ||
382 | u64_to_wwn(phba->cfg_soft_wwnn, | ||
383 | vport->fc_sparam.nodeName.u.wwn); | ||
384 | if (phba->cfg_soft_wwpn) | ||
385 | u64_to_wwn(phba->cfg_soft_wwpn, | ||
386 | vport->fc_sparam.portName.u.wwn); | ||
387 | memcpy(&vport->fc_nodename, &vport->fc_sparam.nodeName, | ||
388 | sizeof (struct lpfc_name)); | ||
389 | memcpy(&vport->fc_portname, &vport->fc_sparam.portName, | ||
390 | sizeof (struct lpfc_name)); | ||
391 | 420 | ||
392 | /* Update the fc_host data structures with new wwn. */ | 421 | /* Update the fc_host data structures with new wwn. */ |
393 | fc_host_node_name(shost) = wwn_to_u64(vport->fc_nodename.u.wwn); | 422 | fc_host_node_name(shost) = wwn_to_u64(vport->fc_nodename.u.wwn); |
@@ -3935,6 +3964,10 @@ lpfc_enable_pci_dev(struct lpfc_hba *phba) | |||
3935 | pci_try_set_mwi(pdev); | 3964 | pci_try_set_mwi(pdev); |
3936 | pci_save_state(pdev); | 3965 | pci_save_state(pdev); |
3937 | 3966 | ||
3967 | /* PCIe EEH recovery on powerpc platforms needs fundamental reset */ | ||
3968 | if (pci_find_capability(pdev, PCI_CAP_ID_EXP)) | ||
3969 | pdev->needs_freset = 1; | ||
3970 | |||
3938 | return 0; | 3971 | return 0; |
3939 | 3972 | ||
3940 | out_disable_device: | 3973 | out_disable_device: |
@@ -4366,6 +4399,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) | |||
4366 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 4399 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
4367 | "2759 Failed allocate memory for FCF round " | 4400 | "2759 Failed allocate memory for FCF round " |
4368 | "robin failover bmask\n"); | 4401 | "robin failover bmask\n"); |
4402 | rc = -ENOMEM; | ||
4369 | goto out_remove_rpi_hdrs; | 4403 | goto out_remove_rpi_hdrs; |
4370 | } | 4404 | } |
4371 | 4405 | ||
@@ -4375,6 +4409,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) | |||
4375 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 4409 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
4376 | "2572 Failed allocate memory for fast-path " | 4410 | "2572 Failed allocate memory for fast-path " |
4377 | "per-EQ handle array\n"); | 4411 | "per-EQ handle array\n"); |
4412 | rc = -ENOMEM; | ||
4378 | goto out_free_fcf_rr_bmask; | 4413 | goto out_free_fcf_rr_bmask; |
4379 | } | 4414 | } |
4380 | 4415 | ||
@@ -4384,6 +4419,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) | |||
4384 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 4419 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
4385 | "2573 Failed allocate memory for msi-x " | 4420 | "2573 Failed allocate memory for msi-x " |
4386 | "interrupt vector entries\n"); | 4421 | "interrupt vector entries\n"); |
4422 | rc = -ENOMEM; | ||
4387 | goto out_free_fcp_eq_hdl; | 4423 | goto out_free_fcp_eq_hdl; |
4388 | } | 4424 | } |
4389 | 4425 | ||
@@ -4998,9 +5034,7 @@ lpfc_sli4_remove_rpi_hdrs(struct lpfc_hba *phba) | |||
4998 | kfree(rpi_hdr->dmabuf); | 5034 | kfree(rpi_hdr->dmabuf); |
4999 | kfree(rpi_hdr); | 5035 | kfree(rpi_hdr); |
5000 | } | 5036 | } |
5001 | |||
5002 | phba->sli4_hba.next_rpi = phba->sli4_hba.max_cfg_param.rpi_base; | 5037 | phba->sli4_hba.next_rpi = phba->sli4_hba.max_cfg_param.rpi_base; |
5003 | memset(phba->sli4_hba.rpi_bmask, 0, sizeof(*phba->sli4_hba.rpi_bmask)); | ||
5004 | } | 5038 | } |
5005 | 5039 | ||
5006 | /** | 5040 | /** |
@@ -5487,7 +5521,8 @@ lpfc_sli4_post_status_check(struct lpfc_hba *phba) | |||
5487 | /* Final checks. The port status should be clean. */ | 5521 | /* Final checks. The port status should be clean. */ |
5488 | if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr, | 5522 | if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr, |
5489 | ®_data.word0) || | 5523 | ®_data.word0) || |
5490 | bf_get(lpfc_sliport_status_err, ®_data)) { | 5524 | (bf_get(lpfc_sliport_status_err, ®_data) && |
5525 | !bf_get(lpfc_sliport_status_rn, ®_data))) { | ||
5491 | phba->work_status[0] = | 5526 | phba->work_status[0] = |
5492 | readl(phba->sli4_hba.u.if_type2. | 5527 | readl(phba->sli4_hba.u.if_type2. |
5493 | ERR1regaddr); | 5528 | ERR1regaddr); |
@@ -6229,8 +6264,10 @@ lpfc_sli4_queue_destroy(struct lpfc_hba *phba) | |||
6229 | phba->sli4_hba.mbx_cq = NULL; | 6264 | phba->sli4_hba.mbx_cq = NULL; |
6230 | 6265 | ||
6231 | /* Release FCP response complete queue */ | 6266 | /* Release FCP response complete queue */ |
6232 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; fcp_qidx++) | 6267 | fcp_qidx = 0; |
6268 | do | ||
6233 | lpfc_sli4_queue_free(phba->sli4_hba.fcp_cq[fcp_qidx]); | 6269 | lpfc_sli4_queue_free(phba->sli4_hba.fcp_cq[fcp_qidx]); |
6270 | while (++fcp_qidx < phba->cfg_fcp_eq_count); | ||
6234 | kfree(phba->sli4_hba.fcp_cq); | 6271 | kfree(phba->sli4_hba.fcp_cq); |
6235 | phba->sli4_hba.fcp_cq = NULL; | 6272 | phba->sli4_hba.fcp_cq = NULL; |
6236 | 6273 | ||
@@ -6353,16 +6390,24 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
6353 | phba->sli4_hba.sp_eq->queue_id); | 6390 | phba->sli4_hba.sp_eq->queue_id); |
6354 | 6391 | ||
6355 | /* Set up fast-path FCP Response Complete Queue */ | 6392 | /* Set up fast-path FCP Response Complete Queue */ |
6356 | for (fcp_cqidx = 0; fcp_cqidx < phba->cfg_fcp_eq_count; fcp_cqidx++) { | 6393 | fcp_cqidx = 0; |
6394 | do { | ||
6357 | if (!phba->sli4_hba.fcp_cq[fcp_cqidx]) { | 6395 | if (!phba->sli4_hba.fcp_cq[fcp_cqidx]) { |
6358 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 6396 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
6359 | "0526 Fast-path FCP CQ (%d) not " | 6397 | "0526 Fast-path FCP CQ (%d) not " |
6360 | "allocated\n", fcp_cqidx); | 6398 | "allocated\n", fcp_cqidx); |
6361 | goto out_destroy_fcp_cq; | 6399 | goto out_destroy_fcp_cq; |
6362 | } | 6400 | } |
6363 | rc = lpfc_cq_create(phba, phba->sli4_hba.fcp_cq[fcp_cqidx], | 6401 | if (phba->cfg_fcp_eq_count) |
6364 | phba->sli4_hba.fp_eq[fcp_cqidx], | 6402 | rc = lpfc_cq_create(phba, |
6365 | LPFC_WCQ, LPFC_FCP); | 6403 | phba->sli4_hba.fcp_cq[fcp_cqidx], |
6404 | phba->sli4_hba.fp_eq[fcp_cqidx], | ||
6405 | LPFC_WCQ, LPFC_FCP); | ||
6406 | else | ||
6407 | rc = lpfc_cq_create(phba, | ||
6408 | phba->sli4_hba.fcp_cq[fcp_cqidx], | ||
6409 | phba->sli4_hba.sp_eq, | ||
6410 | LPFC_WCQ, LPFC_FCP); | ||
6366 | if (rc) { | 6411 | if (rc) { |
6367 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 6412 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
6368 | "0527 Failed setup of fast-path FCP " | 6413 | "0527 Failed setup of fast-path FCP " |
@@ -6371,12 +6416,15 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
6371 | } | 6416 | } |
6372 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | 6417 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, |
6373 | "2588 FCP CQ setup: cq[%d]-id=%d, " | 6418 | "2588 FCP CQ setup: cq[%d]-id=%d, " |
6374 | "parent eq[%d]-id=%d\n", | 6419 | "parent %seq[%d]-id=%d\n", |
6375 | fcp_cqidx, | 6420 | fcp_cqidx, |
6376 | phba->sli4_hba.fcp_cq[fcp_cqidx]->queue_id, | 6421 | phba->sli4_hba.fcp_cq[fcp_cqidx]->queue_id, |
6422 | (phba->cfg_fcp_eq_count) ? "" : "sp_", | ||
6377 | fcp_cqidx, | 6423 | fcp_cqidx, |
6378 | phba->sli4_hba.fp_eq[fcp_cqidx]->queue_id); | 6424 | (phba->cfg_fcp_eq_count) ? |
6379 | } | 6425 | phba->sli4_hba.fp_eq[fcp_cqidx]->queue_id : |
6426 | phba->sli4_hba.sp_eq->queue_id); | ||
6427 | } while (++fcp_cqidx < phba->cfg_fcp_eq_count); | ||
6380 | 6428 | ||
6381 | /* | 6429 | /* |
6382 | * Set up all the Work Queues (WQs) | 6430 | * Set up all the Work Queues (WQs) |
@@ -6445,7 +6493,9 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
6445 | fcp_cq_index, | 6493 | fcp_cq_index, |
6446 | phba->sli4_hba.fcp_cq[fcp_cq_index]->queue_id); | 6494 | phba->sli4_hba.fcp_cq[fcp_cq_index]->queue_id); |
6447 | /* Round robin FCP Work Queue's Completion Queue assignment */ | 6495 | /* Round robin FCP Work Queue's Completion Queue assignment */ |
6448 | fcp_cq_index = ((fcp_cq_index + 1) % phba->cfg_fcp_eq_count); | 6496 | if (phba->cfg_fcp_eq_count) |
6497 | fcp_cq_index = ((fcp_cq_index + 1) % | ||
6498 | phba->cfg_fcp_eq_count); | ||
6449 | } | 6499 | } |
6450 | 6500 | ||
6451 | /* | 6501 | /* |
@@ -6827,6 +6877,8 @@ lpfc_pci_function_reset(struct lpfc_hba *phba) | |||
6827 | if (rdy_chk < 1000) | 6877 | if (rdy_chk < 1000) |
6828 | break; | 6878 | break; |
6829 | } | 6879 | } |
6880 | /* delay driver action following IF_TYPE_2 function reset */ | ||
6881 | msleep(100); | ||
6830 | break; | 6882 | break; |
6831 | case LPFC_SLI_INTF_IF_TYPE_1: | 6883 | case LPFC_SLI_INTF_IF_TYPE_1: |
6832 | default: | 6884 | default: |
@@ -7419,11 +7471,15 @@ enable_msix_vectors: | |||
7419 | /* | 7471 | /* |
7420 | * Assign MSI-X vectors to interrupt handlers | 7472 | * Assign MSI-X vectors to interrupt handlers |
7421 | */ | 7473 | */ |
7422 | 7474 | if (vectors > 1) | |
7423 | /* The first vector must associated to slow-path handler for MQ */ | 7475 | rc = request_irq(phba->sli4_hba.msix_entries[0].vector, |
7424 | rc = request_irq(phba->sli4_hba.msix_entries[0].vector, | 7476 | &lpfc_sli4_sp_intr_handler, IRQF_SHARED, |
7425 | &lpfc_sli4_sp_intr_handler, IRQF_SHARED, | 7477 | LPFC_SP_DRIVER_HANDLER_NAME, phba); |
7426 | LPFC_SP_DRIVER_HANDLER_NAME, phba); | 7478 | else |
7479 | /* All Interrupts need to be handled by one EQ */ | ||
7480 | rc = request_irq(phba->sli4_hba.msix_entries[0].vector, | ||
7481 | &lpfc_sli4_intr_handler, IRQF_SHARED, | ||
7482 | LPFC_DRIVER_NAME, phba); | ||
7427 | if (rc) { | 7483 | if (rc) { |
7428 | lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, | 7484 | lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, |
7429 | "0485 MSI-X slow-path request_irq failed " | 7485 | "0485 MSI-X slow-path request_irq failed " |
@@ -7878,6 +7934,11 @@ lpfc_pc_sli4_params_get(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
7878 | sli4_params->hdr_pp_align = bf_get(hdr_pp_align, &mqe->un.sli4_params); | 7934 | sli4_params->hdr_pp_align = bf_get(hdr_pp_align, &mqe->un.sli4_params); |
7879 | sli4_params->sgl_pages_max = bf_get(sgl_pages, &mqe->un.sli4_params); | 7935 | sli4_params->sgl_pages_max = bf_get(sgl_pages, &mqe->un.sli4_params); |
7880 | sli4_params->sgl_pp_align = bf_get(sgl_pp_align, &mqe->un.sli4_params); | 7936 | sli4_params->sgl_pp_align = bf_get(sgl_pp_align, &mqe->un.sli4_params); |
7937 | |||
7938 | /* Make sure that sge_supp_len can be handled by the driver */ | ||
7939 | if (sli4_params->sge_supp_len > LPFC_MAX_SGE_SIZE) | ||
7940 | sli4_params->sge_supp_len = LPFC_MAX_SGE_SIZE; | ||
7941 | |||
7881 | return rc; | 7942 | return rc; |
7882 | } | 7943 | } |
7883 | 7944 | ||
@@ -7938,6 +7999,11 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
7938 | mbx_sli4_parameters); | 7999 | mbx_sli4_parameters); |
7939 | sli4_params->sgl_pp_align = bf_get(cfg_sgl_pp_align, | 8000 | sli4_params->sgl_pp_align = bf_get(cfg_sgl_pp_align, |
7940 | mbx_sli4_parameters); | 8001 | mbx_sli4_parameters); |
8002 | |||
8003 | /* Make sure that sge_supp_len can be handled by the driver */ | ||
8004 | if (sli4_params->sge_supp_len > LPFC_MAX_SGE_SIZE) | ||
8005 | sli4_params->sge_supp_len = LPFC_MAX_SGE_SIZE; | ||
8006 | |||
7941 | return 0; | 8007 | return 0; |
7942 | } | 8008 | } |
7943 | 8009 | ||
@@ -8591,6 +8657,8 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
8591 | int error; | 8657 | int error; |
8592 | uint32_t cfg_mode, intr_mode; | 8658 | uint32_t cfg_mode, intr_mode; |
8593 | int mcnt; | 8659 | int mcnt; |
8660 | int adjusted_fcp_eq_count; | ||
8661 | int fcp_qidx; | ||
8594 | 8662 | ||
8595 | /* Allocate memory for HBA structure */ | 8663 | /* Allocate memory for HBA structure */ |
8596 | phba = lpfc_hba_alloc(pdev); | 8664 | phba = lpfc_hba_alloc(pdev); |
@@ -8688,11 +8756,25 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
8688 | error = -ENODEV; | 8756 | error = -ENODEV; |
8689 | goto out_free_sysfs_attr; | 8757 | goto out_free_sysfs_attr; |
8690 | } | 8758 | } |
8691 | /* Default to single FCP EQ for non-MSI-X */ | 8759 | /* Default to single EQ for non-MSI-X */ |
8692 | if (phba->intr_type != MSIX) | 8760 | if (phba->intr_type != MSIX) |
8693 | phba->cfg_fcp_eq_count = 1; | 8761 | adjusted_fcp_eq_count = 0; |
8694 | else if (phba->sli4_hba.msix_vec_nr < phba->cfg_fcp_eq_count) | 8762 | else if (phba->sli4_hba.msix_vec_nr < |
8695 | phba->cfg_fcp_eq_count = phba->sli4_hba.msix_vec_nr - 1; | 8763 | phba->cfg_fcp_eq_count + 1) |
8764 | adjusted_fcp_eq_count = phba->sli4_hba.msix_vec_nr - 1; | ||
8765 | else | ||
8766 | adjusted_fcp_eq_count = phba->cfg_fcp_eq_count; | ||
8767 | /* Free unused EQs */ | ||
8768 | for (fcp_qidx = adjusted_fcp_eq_count; | ||
8769 | fcp_qidx < phba->cfg_fcp_eq_count; | ||
8770 | fcp_qidx++) { | ||
8771 | lpfc_sli4_queue_free(phba->sli4_hba.fp_eq[fcp_qidx]); | ||
8772 | /* do not delete the first fcp_cq */ | ||
8773 | if (fcp_qidx) | ||
8774 | lpfc_sli4_queue_free( | ||
8775 | phba->sli4_hba.fcp_cq[fcp_qidx]); | ||
8776 | } | ||
8777 | phba->cfg_fcp_eq_count = adjusted_fcp_eq_count; | ||
8696 | /* Set up SLI-4 HBA */ | 8778 | /* Set up SLI-4 HBA */ |
8697 | if (lpfc_sli4_hba_setup(phba)) { | 8779 | if (lpfc_sli4_hba_setup(phba)) { |
8698 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 8780 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 0d92d4205ea6..9bf7eb85d172 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c | |||
@@ -350,11 +350,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | |||
350 | ndlp->nlp_maxframe = | 350 | ndlp->nlp_maxframe = |
351 | ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | sp->cmn.bbRcvSizeLsb; | 351 | ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | sp->cmn.bbRcvSizeLsb; |
352 | 352 | ||
353 | /* | 353 | /* no need to reg_login if we are already in one of these states */ |
354 | * Need to unreg_login if we are already in one of these states and | ||
355 | * change to NPR state. This will block the port until after the ACC | ||
356 | * completes and the reg_login is issued and completed. | ||
357 | */ | ||
358 | switch (ndlp->nlp_state) { | 354 | switch (ndlp->nlp_state) { |
359 | case NLP_STE_NPR_NODE: | 355 | case NLP_STE_NPR_NODE: |
360 | if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) | 356 | if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) |
@@ -363,9 +359,8 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | |||
363 | case NLP_STE_PRLI_ISSUE: | 359 | case NLP_STE_PRLI_ISSUE: |
364 | case NLP_STE_UNMAPPED_NODE: | 360 | case NLP_STE_UNMAPPED_NODE: |
365 | case NLP_STE_MAPPED_NODE: | 361 | case NLP_STE_MAPPED_NODE: |
366 | lpfc_unreg_rpi(vport, ndlp); | 362 | lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL); |
367 | ndlp->nlp_prev_state = ndlp->nlp_state; | 363 | return 1; |
368 | lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); | ||
369 | } | 364 | } |
370 | 365 | ||
371 | if ((vport->fc_flag & FC_PT2PT) && | 366 | if ((vport->fc_flag & FC_PT2PT) && |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 84e4481b2406..bc8359b038c4 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -861,6 +861,7 @@ lpfc_new_scsi_buf_s4(struct lpfc_vport *vport, int num_to_alloc) | |||
861 | */ | 861 | */ |
862 | sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_cmd)); | 862 | sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_cmd)); |
863 | sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_cmd)); | 863 | sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_cmd)); |
864 | sgl->word2 = le32_to_cpu(sgl->word2); | ||
864 | bf_set(lpfc_sli4_sge_last, sgl, 0); | 865 | bf_set(lpfc_sli4_sge_last, sgl, 0); |
865 | sgl->word2 = cpu_to_le32(sgl->word2); | 866 | sgl->word2 = cpu_to_le32(sgl->word2); |
866 | sgl->sge_len = cpu_to_le32(sizeof(struct fcp_cmnd)); | 867 | sgl->sge_len = cpu_to_le32(sizeof(struct fcp_cmnd)); |
@@ -869,6 +870,7 @@ lpfc_new_scsi_buf_s4(struct lpfc_vport *vport, int num_to_alloc) | |||
869 | /* Setup the physical region for the FCP RSP */ | 870 | /* Setup the physical region for the FCP RSP */ |
870 | sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_rsp)); | 871 | sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_rsp)); |
871 | sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_rsp)); | 872 | sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_rsp)); |
873 | sgl->word2 = le32_to_cpu(sgl->word2); | ||
872 | bf_set(lpfc_sli4_sge_last, sgl, 1); | 874 | bf_set(lpfc_sli4_sge_last, sgl, 1); |
873 | sgl->word2 = cpu_to_le32(sgl->word2); | 875 | sgl->word2 = cpu_to_le32(sgl->word2); |
874 | sgl->sge_len = cpu_to_le32(sizeof(struct fcp_rsp)); | 876 | sgl->sge_len = cpu_to_le32(sizeof(struct fcp_rsp)); |
@@ -2081,6 +2083,7 @@ lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | |||
2081 | dma_len = sg_dma_len(sgel); | 2083 | dma_len = sg_dma_len(sgel); |
2082 | sgl->addr_lo = cpu_to_le32(putPaddrLow(physaddr)); | 2084 | sgl->addr_lo = cpu_to_le32(putPaddrLow(physaddr)); |
2083 | sgl->addr_hi = cpu_to_le32(putPaddrHigh(physaddr)); | 2085 | sgl->addr_hi = cpu_to_le32(putPaddrHigh(physaddr)); |
2086 | sgl->word2 = le32_to_cpu(sgl->word2); | ||
2084 | if ((num_bde + 1) == nseg) | 2087 | if ((num_bde + 1) == nseg) |
2085 | bf_set(lpfc_sli4_sge_last, sgl, 1); | 2088 | bf_set(lpfc_sli4_sge_last, sgl, 1); |
2086 | else | 2089 | else |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index fd5835e1c039..dd911d6d0ee5 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -65,6 +65,9 @@ static struct lpfc_iocbq *lpfc_sli4_els_wcqe_to_rspiocbq(struct lpfc_hba *, | |||
65 | struct lpfc_iocbq *); | 65 | struct lpfc_iocbq *); |
66 | static void lpfc_sli4_send_seq_to_ulp(struct lpfc_vport *, | 66 | static void lpfc_sli4_send_seq_to_ulp(struct lpfc_vport *, |
67 | struct hbq_dmabuf *); | 67 | struct hbq_dmabuf *); |
68 | static int lpfc_sli4_fp_handle_wcqe(struct lpfc_hba *, struct lpfc_queue *, | ||
69 | struct lpfc_cqe *); | ||
70 | |||
68 | static IOCB_t * | 71 | static IOCB_t * |
69 | lpfc_get_iocb_from_iocbq(struct lpfc_iocbq *iocbq) | 72 | lpfc_get_iocb_from_iocbq(struct lpfc_iocbq *iocbq) |
70 | { | 73 | { |
@@ -3881,8 +3884,10 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba) | |||
3881 | list_del_init(&phba->sli4_hba.els_cq->list); | 3884 | list_del_init(&phba->sli4_hba.els_cq->list); |
3882 | for (qindx = 0; qindx < phba->cfg_fcp_wq_count; qindx++) | 3885 | for (qindx = 0; qindx < phba->cfg_fcp_wq_count; qindx++) |
3883 | list_del_init(&phba->sli4_hba.fcp_wq[qindx]->list); | 3886 | list_del_init(&phba->sli4_hba.fcp_wq[qindx]->list); |
3884 | for (qindx = 0; qindx < phba->cfg_fcp_eq_count; qindx++) | 3887 | qindx = 0; |
3888 | do | ||
3885 | list_del_init(&phba->sli4_hba.fcp_cq[qindx]->list); | 3889 | list_del_init(&phba->sli4_hba.fcp_cq[qindx]->list); |
3890 | while (++qindx < phba->cfg_fcp_eq_count); | ||
3886 | spin_unlock_irq(&phba->hbalock); | 3891 | spin_unlock_irq(&phba->hbalock); |
3887 | 3892 | ||
3888 | /* Now physically reset the device */ | 3893 | /* Now physically reset the device */ |
@@ -4677,9 +4682,11 @@ lpfc_sli4_arm_cqeq_intr(struct lpfc_hba *phba) | |||
4677 | 4682 | ||
4678 | lpfc_sli4_cq_release(phba->sli4_hba.mbx_cq, LPFC_QUEUE_REARM); | 4683 | lpfc_sli4_cq_release(phba->sli4_hba.mbx_cq, LPFC_QUEUE_REARM); |
4679 | lpfc_sli4_cq_release(phba->sli4_hba.els_cq, LPFC_QUEUE_REARM); | 4684 | lpfc_sli4_cq_release(phba->sli4_hba.els_cq, LPFC_QUEUE_REARM); |
4680 | for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_eq_count; fcp_eqidx++) | 4685 | fcp_eqidx = 0; |
4686 | do | ||
4681 | lpfc_sli4_cq_release(phba->sli4_hba.fcp_cq[fcp_eqidx], | 4687 | lpfc_sli4_cq_release(phba->sli4_hba.fcp_cq[fcp_eqidx], |
4682 | LPFC_QUEUE_REARM); | 4688 | LPFC_QUEUE_REARM); |
4689 | while (++fcp_eqidx < phba->cfg_fcp_eq_count); | ||
4683 | lpfc_sli4_eq_release(phba->sli4_hba.sp_eq, LPFC_QUEUE_REARM); | 4690 | lpfc_sli4_eq_release(phba->sli4_hba.sp_eq, LPFC_QUEUE_REARM); |
4684 | for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_eq_count; fcp_eqidx++) | 4691 | for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_eq_count; fcp_eqidx++) |
4685 | lpfc_sli4_eq_release(phba->sli4_hba.fp_eq[fcp_eqidx], | 4692 | lpfc_sli4_eq_release(phba->sli4_hba.fp_eq[fcp_eqidx], |
@@ -4740,7 +4747,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) | |||
4740 | * to read FCoE param config regions | 4747 | * to read FCoE param config regions |
4741 | */ | 4748 | */ |
4742 | if (lpfc_sli4_read_fcoe_params(phba, mboxq)) | 4749 | if (lpfc_sli4_read_fcoe_params(phba, mboxq)) |
4743 | lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_INIT, | 4750 | lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_INIT, |
4744 | "2570 Failed to read FCoE parameters\n"); | 4751 | "2570 Failed to read FCoE parameters\n"); |
4745 | 4752 | ||
4746 | /* Issue READ_REV to collect vpd and FW information. */ | 4753 | /* Issue READ_REV to collect vpd and FW information. */ |
@@ -4906,16 +4913,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) | |||
4906 | goto out_free_mbox; | 4913 | goto out_free_mbox; |
4907 | } | 4914 | } |
4908 | 4915 | ||
4909 | if (phba->cfg_soft_wwnn) | 4916 | lpfc_update_vport_wwn(vport); |
4910 | u64_to_wwn(phba->cfg_soft_wwnn, | ||
4911 | vport->fc_sparam.nodeName.u.wwn); | ||
4912 | if (phba->cfg_soft_wwpn) | ||
4913 | u64_to_wwn(phba->cfg_soft_wwpn, | ||
4914 | vport->fc_sparam.portName.u.wwn); | ||
4915 | memcpy(&vport->fc_nodename, &vport->fc_sparam.nodeName, | ||
4916 | sizeof(struct lpfc_name)); | ||
4917 | memcpy(&vport->fc_portname, &vport->fc_sparam.portName, | ||
4918 | sizeof(struct lpfc_name)); | ||
4919 | 4917 | ||
4920 | /* Update the fc_host data structures with new wwn. */ | 4918 | /* Update the fc_host data structures with new wwn. */ |
4921 | fc_host_node_name(shost) = wwn_to_u64(vport->fc_nodename.u.wwn); | 4919 | fc_host_node_name(shost) = wwn_to_u64(vport->fc_nodename.u.wwn); |
@@ -5747,10 +5745,15 @@ lpfc_sli4_post_sync_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
5747 | lpfc_sli_pcimem_bcopy(&mbox_rgn->mcqe, &mboxq->mcqe, | 5745 | lpfc_sli_pcimem_bcopy(&mbox_rgn->mcqe, &mboxq->mcqe, |
5748 | sizeof(struct lpfc_mcqe)); | 5746 | sizeof(struct lpfc_mcqe)); |
5749 | mcqe_status = bf_get(lpfc_mcqe_status, &mbox_rgn->mcqe); | 5747 | mcqe_status = bf_get(lpfc_mcqe_status, &mbox_rgn->mcqe); |
5750 | 5748 | /* | |
5751 | /* Prefix the mailbox status with range x4000 to note SLI4 status. */ | 5749 | * When the CQE status indicates a failure and the mailbox status |
5750 | * indicates success then copy the CQE status into the mailbox status | ||
5751 | * (and prefix it with x4000). | ||
5752 | */ | ||
5752 | if (mcqe_status != MB_CQE_STATUS_SUCCESS) { | 5753 | if (mcqe_status != MB_CQE_STATUS_SUCCESS) { |
5753 | bf_set(lpfc_mqe_status, mb, LPFC_MBX_ERROR_RANGE | mcqe_status); | 5754 | if (bf_get(lpfc_mqe_status, mb) == MBX_SUCCESS) |
5755 | bf_set(lpfc_mqe_status, mb, | ||
5756 | (LPFC_MBX_ERROR_RANGE | mcqe_status)); | ||
5754 | rc = MBXERR_ERROR; | 5757 | rc = MBXERR_ERROR; |
5755 | } else | 5758 | } else |
5756 | lpfc_sli4_swap_str(phba, mboxq); | 5759 | lpfc_sli4_swap_str(phba, mboxq); |
@@ -5819,7 +5822,7 @@ lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq, | |||
5819 | else | 5822 | else |
5820 | rc = -EIO; | 5823 | rc = -EIO; |
5821 | if (rc != MBX_SUCCESS) | 5824 | if (rc != MBX_SUCCESS) |
5822 | lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI, | 5825 | lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_SLI, |
5823 | "(%d):2541 Mailbox command x%x " | 5826 | "(%d):2541 Mailbox command x%x " |
5824 | "(x%x) cannot issue Data: x%x x%x\n", | 5827 | "(x%x) cannot issue Data: x%x x%x\n", |
5825 | mboxq->vport ? mboxq->vport->vpi : 0, | 5828 | mboxq->vport ? mboxq->vport->vpi : 0, |
@@ -6307,6 +6310,7 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq, | |||
6307 | sgl->addr_hi = bpl->addrHigh; | 6310 | sgl->addr_hi = bpl->addrHigh; |
6308 | sgl->addr_lo = bpl->addrLow; | 6311 | sgl->addr_lo = bpl->addrLow; |
6309 | 6312 | ||
6313 | sgl->word2 = le32_to_cpu(sgl->word2); | ||
6310 | if ((i+1) == numBdes) | 6314 | if ((i+1) == numBdes) |
6311 | bf_set(lpfc_sli4_sge_last, sgl, 1); | 6315 | bf_set(lpfc_sli4_sge_last, sgl, 1); |
6312 | else | 6316 | else |
@@ -6343,6 +6347,7 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq, | |||
6343 | cpu_to_le32(icmd->un.genreq64.bdl.addrHigh); | 6347 | cpu_to_le32(icmd->un.genreq64.bdl.addrHigh); |
6344 | sgl->addr_lo = | 6348 | sgl->addr_lo = |
6345 | cpu_to_le32(icmd->un.genreq64.bdl.addrLow); | 6349 | cpu_to_le32(icmd->un.genreq64.bdl.addrLow); |
6350 | sgl->word2 = le32_to_cpu(sgl->word2); | ||
6346 | bf_set(lpfc_sli4_sge_last, sgl, 1); | 6351 | bf_set(lpfc_sli4_sge_last, sgl, 1); |
6347 | sgl->word2 = cpu_to_le32(sgl->word2); | 6352 | sgl->word2 = cpu_to_le32(sgl->word2); |
6348 | sgl->sge_len = | 6353 | sgl->sge_len = |
@@ -9799,7 +9804,12 @@ lpfc_sli4_sp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe) | |||
9799 | break; | 9804 | break; |
9800 | case LPFC_WCQ: | 9805 | case LPFC_WCQ: |
9801 | while ((cqe = lpfc_sli4_cq_get(cq))) { | 9806 | while ((cqe = lpfc_sli4_cq_get(cq))) { |
9802 | workposted |= lpfc_sli4_sp_handle_cqe(phba, cq, cqe); | 9807 | if (cq->subtype == LPFC_FCP) |
9808 | workposted |= lpfc_sli4_fp_handle_wcqe(phba, cq, | ||
9809 | cqe); | ||
9810 | else | ||
9811 | workposted |= lpfc_sli4_sp_handle_cqe(phba, cq, | ||
9812 | cqe); | ||
9803 | if (!(++ecount % LPFC_GET_QE_REL_INT)) | 9813 | if (!(++ecount % LPFC_GET_QE_REL_INT)) |
9804 | lpfc_sli4_cq_release(cq, LPFC_QUEUE_NOARM); | 9814 | lpfc_sli4_cq_release(cq, LPFC_QUEUE_NOARM); |
9805 | } | 9815 | } |