|
@@ -3555,6 +3555,44 @@ out_free_mem:
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+static uint64_t
|
|
|
+lpfc_get_wwpn(struct lpfc_hba *phba)
|
|
|
+{
|
|
|
+ uint64_t wwn;
|
|
|
+ int rc;
|
|
|
+ LPFC_MBOXQ_t *mboxq;
|
|
|
+ MAILBOX_t *mb;
|
|
|
+
|
|
|
+
|
|
|
+ mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool,
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!mboxq)
|
|
|
+ return (uint64_t)-1;
|
|
|
+
|
|
|
+ /* First get WWN of HBA instance */
|
|
|
+ lpfc_read_nv(phba, mboxq);
|
|
|
+ rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
|
|
|
+ if (rc != MBX_SUCCESS) {
|
|
|
+ lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
|
|
|
+ "6019 Mailbox failed , mbxCmd x%x "
|
|
|
+ "READ_NV, mbxStatus x%x\n",
|
|
|
+ bf_get(lpfc_mqe_command, &mboxq->u.mqe),
|
|
|
+ bf_get(lpfc_mqe_status, &mboxq->u.mqe));
|
|
|
+ mempool_free(mboxq, phba->mbox_mem_pool);
|
|
|
+ return (uint64_t) -1;
|
|
|
+ }
|
|
|
+ mb = &mboxq->u.mb;
|
|
|
+ memcpy(&wwn, (char *)mb->un.varRDnvp.portname, sizeof(uint64_t));
|
|
|
+ /* wwn is WWPN of HBA instance */
|
|
|
+ mempool_free(mboxq, phba->mbox_mem_pool);
|
|
|
+ if (phba->sli_rev == LPFC_SLI_REV4)
|
|
|
+ return be64_to_cpu(wwn);
|
|
|
+ else
|
|
|
+ return (((wwn & 0xffffffff00000000) >> 32) |
|
|
|
+ ((wwn & 0x00000000ffffffff) << 32));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* lpfc_sli4_nvme_sgl_update - update xri-sgl sizing and mapping
|
|
|
* @phba: pointer to lpfc hba data structure.
|
|
@@ -3676,17 +3714,32 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
|
|
|
struct lpfc_vport *vport;
|
|
|
struct Scsi_Host *shost = NULL;
|
|
|
int error = 0;
|
|
|
+ int i;
|
|
|
+ uint64_t wwn;
|
|
|
+ bool use_no_reset_hba = false;
|
|
|
+
|
|
|
+ wwn = lpfc_get_wwpn(phba);
|
|
|
+
|
|
|
+ for (i = 0; i < lpfc_no_hba_reset_cnt; i++) {
|
|
|
+ if (wwn == lpfc_no_hba_reset[i]) {
|
|
|
+ lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
|
|
|
+ "6020 Setting use_no_reset port=%llx\n",
|
|
|
+ wwn);
|
|
|
+ use_no_reset_hba = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) {
|
|
|
if (dev != &phba->pcidev->dev) {
|
|
|
shost = scsi_host_alloc(&lpfc_vport_template,
|
|
|
sizeof(struct lpfc_vport));
|
|
|
} else {
|
|
|
- if (phba->sli_rev == LPFC_SLI_REV4)
|
|
|
+ if (!use_no_reset_hba)
|
|
|
shost = scsi_host_alloc(&lpfc_template,
|
|
|
sizeof(struct lpfc_vport));
|
|
|
else
|
|
|
- shost = scsi_host_alloc(&lpfc_template_s3,
|
|
|
+ shost = scsi_host_alloc(&lpfc_template_no_hr,
|
|
|
sizeof(struct lpfc_vport));
|
|
|
}
|
|
|
} else if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) {
|
|
@@ -5472,7 +5525,8 @@ lpfc_sli_driver_resource_setup(struct lpfc_hba *phba)
|
|
|
|
|
|
/* Initialize the host templates the configured values. */
|
|
|
lpfc_vport_template.sg_tablesize = phba->cfg_sg_seg_cnt;
|
|
|
- lpfc_template_s3.sg_tablesize = phba->cfg_sg_seg_cnt;
|
|
|
+ lpfc_template_no_hr.sg_tablesize = phba->cfg_sg_seg_cnt;
|
|
|
+ lpfc_template.sg_tablesize = phba->cfg_sg_seg_cnt;
|
|
|
|
|
|
/* There are going to be 2 reserved BDEs: 1 FCP cmnd + 1 FCP rsp */
|
|
|
if (phba->cfg_enable_bg) {
|
|
@@ -5693,6 +5747,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
|
|
|
/* Initialize the host templates with the updated values. */
|
|
|
lpfc_vport_template.sg_tablesize = phba->cfg_sg_seg_cnt;
|
|
|
lpfc_template.sg_tablesize = phba->cfg_sg_seg_cnt;
|
|
|
+ lpfc_template_no_hr.sg_tablesize = phba->cfg_sg_seg_cnt;
|
|
|
|
|
|
if (phba->cfg_sg_dma_buf_size <= LPFC_MIN_SG_SLI4_BUF_SZ)
|
|
|
phba->cfg_sg_dma_buf_size = LPFC_MIN_SG_SLI4_BUF_SZ;
|